SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.02.2009 16:52:00

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Оптимизация запроса

Такая проблема:
как такой запрос написать правильно:

$database->setQuery("SELECT * FROM users");
    $list = $database->loadObjectList();
    foreach($list as $var)
    {
    $database->setQuery("SELECT * FROM links WHERE id='{$var->userid}'");
    $list = $database->loadObjectList();
    foreach($list as $var2)
             {
             $database->setQuery("SELECT * FROM posts WHERE id='{$var2->postid}'");
    $list = $database->loadObjectList();
    foreach($list as $var3)
             echo $var->user.' '.$var3->post;
    }
             }

Таблицы:
users - пользователи, колонки: id (auto increment), user - имя пользователя, postid - id должности.
posts - должности, колонки: id (auto increment), post - название должности.
links - связи, колонки userid - id пользователя, postid - id пользователя.

Если например 100 пользователей то будет 100 запросов к базе post и 100 запросов к базе links.
И правильно ли я создал таблицу links? Она нужна изза того что у одного пользователя должна быть возможность добавления неограниченного количества должностей.

Неактивен

 

#2 18.02.2009 17:07:28

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Оптимизация запроса

Примерно так:

Код:

$database->setQuery(
"SELECT `users`.`user`,`posts`.`post`
FROM `users`
JOIN `links` ON `links`.`userid`=`users`.`id`
JOIN `posts` ON `posts`.`id`=`links`.`postid`");
$list = $database->loadObjectList();
foreach($list as $var)
    echo "{$var->user} {$var->post}\n";

Поле `postid` в таблице `users` вроде как лишнее.

Отредактированно coin (18.02.2009 17:08:33)

Неактивен

 

#3 18.02.2009 17:52:46

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Re: Оптимизация запроса

Супер! работает, но только оно отображает только одну должность, а нужно чтоб должностей было не ограничено

Неактивен

 

#4 18.02.2009 17:55:56

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Оптимизация запроса

Должно выбирать всех пользователей в паре с соответствующими должностями. Если в таблице links одна запись для конкретного пользователя, значит он втретится в этой выборке только один раз, если 10, значит 10..

Неактивен

 

#5 18.02.2009 17:59:44

coin
Гуру
Зарегистрирован: 15.07.2008
Сообщений: 66

Re: Оптимизация запроса

Можно сгруппировать, чтобы каждый пользователь входил в выборку только один раз со своим списком:

Код:

$database->setQuery(
"SELECT `users`.`user`,GROUP_CONCAT(`posts`.`post`) `posts`
FROM `users`
JOIN `links` ON `links`.`userid`=`users`.`id`
JOIN `posts` ON `posts`.`id`=`links`.`postid`
GROUP BY `users`.`id`");
$list = $database->loadObjectList();
foreach($list as $var)
    echo "{$var->user} {$var->posts}\n";

Неактивен

 

#6 18.02.2009 18:05:30

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Re: Оптимизация запроса

Разобрался, спасибо ОГРОМНОЕsmile

Неактивен

 

#7 18.02.2009 20:51:10

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Re: Оптимизация запроса

Подскажите плз еще что тут не правильно?

"SELECT * FROM posts, users JOIN links ON links.wpid='{$wpid}'
AND links.userid=users.id AND users.postid = posts.id");

Мне нужно чтоб из базы links выбирались пользователи с заданным wpid и сопоставлялись с базой users и одновременно для каждого postid в таблице users подбирался id из таблицы posts

Неактивен

 

#8 18.02.2009 21:00:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Оптимизация запроса

Лучше объединения писать или через запятую, или через JOIN. Иначе очень тяжело понять
логику выражения.

SELECT * FROM post, users, links
WHERE ...

Неактивен

 

#9 18.02.2009 21:13:21

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Re: Оптимизация запроса

Тоесть через AND?
SELECT * FROM post, users, links
WHERE links.wpid='{$wpid}' AND links.userid=users.id AND users.postid=posts.id  ?

И как отобразить запись если в поле post.id - 0?

Неактивен

 

#10 18.02.2009 21:22:52

tim-ua
Участник
Зарегистрирован: 18.02.2009
Сообщений: 7

Re: Оптимизация запроса

Я пробовал через логическую или но чето не работает -

SELECT * FROM post, users, links
WHERE links.wpid='{$wpid}' AND links.userid=users.id AND users.postid=posts.id||0

Неактивен

 

#11 18.02.2009 21:35:22

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Оптимизация запроса

Честно говоря, не понял вопроса.

WHERE ... AND ((users.postid = posts.id) OR (users.postid = 0))

Вот это Вы имели в виду?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson