|
|
|
| Помогите с новой проблемой (форум перекопал, но недалеко продвинулся).
Есть три таблицы:
table1 (картинки)
id_1
field1_1
field1_2
table2 (комментарии)
id_2
op_1
field2_1
field2_2
table3 (пользователи)
id_1
op_2
field_1
field_2
у table1 и table2 id_1 = id_2
у table2 и table3 op_1 = op_2
Как сделать выборку и вывод на печать с трех таблиц?
Схема:
IMAGE1
comment1 - user1
comment2 - user2
comment3 - user3
IMAGE2
comment1 - user1
comment2 - user2
comment3 - user3
и т.д. .......
Полей и записей много, поэтому очень большое пожелание: если можно, то что-нибудь пооптимальнее. | |
|
|
|
|
|
|
|
для: SS
(24.04.2005 в 05:50)
| | Я немного переделал таблицы (везде назначил осмысленные имена), чтобы было удобнее составлять запрос, вот дамп новой базы данных
CREATE TABLE comments (
id_comment int(11) NOT NULL auto_increment,
name_comment text NOT NULL,
puttime datetime NOT NULL default '0000-00-00 00:00:00',
id_user int(11) NOT NULL default '0',
id_image int(11) NOT NULL default '0',
PRIMARY KEY (id_comment),
KEY id_user (id_user,id_image)
) TYPE=MyISAM;
INSERT INTO comments VALUES (1, 'Волшебно', '2005-04-24 14:50:44', 1, 1);
INSERT INTO comments VALUES (2, 'Не говори!', '2005-04-24 14:51:03', 2, 1);
INSERT INTO comments VALUES (3, 'А я что говорю?', '2005-04-24 14:51:21', 1, 1);
INSERT INTO comments VALUES (4, 'Не передаваемо!', '2005-04-24 14:52:15', 1, 2);
INSERT INTO comments VALUES (5, 'Эт точно', '2005-04-24 14:52:23', 2, 2);
CREATE TABLE images (
id_image int(11) NOT NULL auto_increment,
name text NOT NULL,
PRIMARY KEY (id_image)
) TYPE=MyISAM;
INSERT INTO images VALUES (1, 'Монета 1');
INSERT INTO images VALUES (2, 'Монета 2');
CREATE TABLE users (
id_user int(11) NOT NULL auto_increment,
name_user text NOT NULL,
PRIMARY KEY (id_user)
) TYPE=MyISAM;
INSERT INTO users VALUES (1, 'Пользователь 1');
INSERT INTO users VALUES (2, 'Пользователь 2');
|
Тогда запрос к этим трём таблицам может выглядеть следующим образом
SELECT * FROM comments, users, images
WHERE images.id_image = comments.id_image AND
users.id_user = comments.id_user
ORDER BY images.id_image, comments.puttime
|
| |
|
|
|
|
|
|
|
для: cheops
(24.04.2005 в 14:59)
| | Отлично, все работает! Я дня три прокопался с этим, думал сам доеду... :)
Сейчас выборка происходит, только если все условия выполняются. Как выводить также и те картинки, у которых нет комментариев? | |
|
|
|
|
|
|
|
для: SS
(24.04.2005 в 23:48)
| | В этом же запросе вряд ли получится - их можно извлечь дополнительным запросом. | |
|
|
|
|
|
|
|
для: cheops
(25.04.2005 в 13:25)
| | Покажите, пожалуйста, как выглядит упрощенная схема такого запроса в запросе? | |
|
|
|
|
|
|
|
для: SS
(25.04.2005 в 18:33)
| | А вложенный запрос не сработает, они только в MySQL 4.1 появились, у вас какая версия MySQL? | |
|
|
|
|
|
|
|
для: cheops
(25.04.2005 в 21:41)
| | -- Версия сервера: 4.0.21
-- Версия PHP: 4.3.9 | |
|
|
|
|
|
|
|
для: SS
(25.04.2005 в 23:25)
| | Нет, тогда не получится, получится только так: первым запросом вывести изображения у которых имеется комментарий, а вторым, отдельным запросом те, у которых нет ни одного комментария (сортировки средствами MySQL здесь к сожалению не получится). Можно сделать финт ушами, добавить системного пользователя в таблицу users (скажем с первичным ключём id_user = 0) и добавить каждому из изображений (автоматически) комментарий этого пользователя, а затем просто не выводить комментарий такого пользователя уже средствами PHP - грубо, но работает. | |
|
|
|
|
|
|
|
для: cheops
(26.04.2005 в 13:56)
| | Вы хотите сказать, что нельзя вывести такой запрос:
<Вывести все картинки, удовлетворяющие запросу>
IMAGE, где
<если есть комментарии, у которых ID_COMMENT=ID_IMAGE, то вывести эти комментарии><если ID_USER_COMMENT=ID COMMENT, то вывести такого юзера>
и т.д. в цикле
???
Мне кажется это довольно простым запросом с парой условий, просто я не знаю как это написать.
Как же тогда работают гостевые книги, форумы и галереи с возможностью оставить комментарий - там же примерно то же самое, что и мне нужно? | |
|
|
|
|
|
|
|
для: SS
(26.04.2005 в 18:22)
| | Там не трёхтабличный запрос. Обычно запрашивают картинки - выводят их и для каждой картинки проверяют наличие комментариев. Т.е. система состоит из запроса - обработки результата в цикле и запроса в цикле не комментарии к изображениям. | |
|
|
|
|
|
|
|
для: cheops
(26.04.2005 в 23:10)
| | Ну я же не знал, что тут такие тонкости с названиями. Я как думал, так и сказал. :)
Хорошо, помогите тогда пожалуйста с такой схемой, - мне важен результат, мне нужно вывести все картинки и все комментарии. | |
|
|
|
|
|
|
|
для: cheops
(26.04.2005 в 23:10)
| | Очень жду!!! - у меня вся работа из-за этого встала. | |
|
|
|
|
|
|
|
для: SS
(27.04.2005 в 22:57)
| | Можно поступить примерно следующим образом
<?php
// Устанавливаем соединение с базой данных
include "config.php";
// Формируем запрос на выборку изображений
// с сортировкой по имени изображения
$query = "SELECT * FROM images ORDER BY name";
// Выполняем запрос
$tb = mysql_query($query);
// Проверяем правильность выполнения запроса
if(!$tb) exit(mysql_error());
// В цикле выполняем вывод изображений
while($img = mysql_fetch_array($tb))
{
echo $img['name']."<br>";
// Запрашиваем комментарии для данного изображения
$query = "SELECT comments.name_comment AS name_comment,
comments.puttime AS puttime,
users.name_user AS name_user
FROM comments, users
WHERE comments.id_image = $img[id_image] AND
users.id_user = comments.id_user
ORDER BY comments.puttime DESC";
// Выполняем запрос
$com = mysql_query($query);
// Проверяем правильность выполнения запроса
if(!$com) exit(mysql_error());
// Если есть хоть один комментарий - выводим
if(mysql_num_rows($com)>0)
{
while($comment = mysql_fetch_array($com))
{
echo $comment['puttime']." - ".$comment['name_user']."<br>";
echo $comment['name_comment']."<br>";
}
}
else
{
// Здесь можно вывести, что комментарие нет
}
echo "<br>";
}
?>
|
При использовании в первом запросе ограничения LIMIT (вы наверное всё равно будет постраничную навигацию использовать) заметного уменьшения скорости наблюдаться не должно. | |
|
|
|
|
|
|
|
для: cheops
(27.04.2005 в 23:37)
| | Все супер, спасибо, работает! | |
|
|
|