SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 03.01.2012 16:56:25

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Как переписать запрос на поиск

Есть запрос, например такого характера


SELECT users.login, count(msgs.readed)
FROM users, msgs
WHERE users.login = 'vasya' AND msgs.readed = 'no'
LIMIT 1


Если у меня нет непрочитанных сообщений, то возвращает логин null.
Если есть хотя бы одно — отдает правильно. Что я неверно пишу?

Неактивен

 

#2 03.01.2012 23:13:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как переписать запрос на поиск

Так и должно быть. Использование групповой функции (в вашем случае count) означает неявную группировку.
Вашему условию where соответствует пустая выборка и теперь вы просите посчитать кол-во строк в ней, в результате возвращается одна строка, в которой информация о кол-ве строк =0 и соответствующем логине, т.е. null так как такого логина нет.

Неактивен

 

#3 17.01.2012 16:47:53

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Каким образом тогда выводятся, допустим, комментарии к статьям? А если комментариев пока нет?

Неактивен

 

#4 17.01.2012 16:50:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как переписать запрос на поиск

Сформулируйте пожалуйста точнее - какие таблицы у Вас есть (названия таблиц, поля) - и какую выборку Вы хотите получить


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 17.01.2012 16:57:52

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Давайте, чтобы проще было:
Таблица topics, поле: topic_id
Таблица comments, поля: comment_id, topic

Ну, и мой селект тут не работает:

SELECT topics.topics_id, count(comment_id)
FROM topics, comments
WHERE comments.topic = topics.topics_id
LIMIT 5;

Неактивен

 

#6 17.01.2012 17:03:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как переписать запрос на поиск

SELECT такой и не сработает - Вы выбираете скалярное значение в одном столбце и колонку в другом.
В каком виде Вы хотите получить комментарии?
Подозреваю, что SELECT * FROM comment; - это не совсем то, что Вам нужно smile?
Если же Вы хотите посчитать количество комментариев к топикам, то скорее так:
SELECT topic,count(*) FROM coments group by topic order by 2 asc;
(Те топики, к которым нет комментариев не будут участвовать в выборке)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 17.01.2012 17:08:37

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Немного запутанно, но судя по всему, нужно использовать силу, т.е. group by. Буду разбираться, спасибо.

Неактивен

 

#8 17.01.2012 17:10:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как переписать запрос на поиск

Ну, если бы Вы чётче формализовали то, что хотите от запроса получить - глядишь я бы и меньшебукв писал. А что запутанно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 17.01.2012 17:37:46

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Глядишь, и ваша правда.
Все верно вы догадались, пытаюсь подсчитать комментарии к каждой теме.
А запутан для меня конец запроса:

SELECT topic,count(*) FROM coments group by topic order by 2 asc;

order by 2 asc. Как понять двойку?  О_о

Неактивен

 

#10 17.01.2012 18:10:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как переписать запрос на поиск

Это означает, что сортируем по второй колонке по возрастанию, по count(*).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 17.01.2012 23:39:31

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Переписал запрос с group. Все равно выбирает только ненулевые. Есть еще какие-нибудь варианты?
Запрос выглядит, в целом, так (прошу не обращать внимания на вставки, там дополнительные условия):


SELECT proposals.id,
    proposals.author_id,
    proposals.since,
    proposals.throw,
    proposals.comment_text,
    proposals.geo_items,
    proposals.added_images,
    users.login,
    users.id as author,
    proposals_comments.theme_id,
    count(proposals_comments.id) as comments
    FROM proposals, users, proposals_comments
    WHERE users.id = proposals.author_id AND proposals_comments.theme_id = proposals.id '.$condition.'
    GROUP BY proposals.id
    ORDER BY id DESC
    LIMIT '.$from.' 10;
 


Если не затруднит, что я неверно делаю?
Без выборки из таблицы proposals_comments отдает все варианты, с выборкой - ненулевые.

Отредактированно wine-time (17.01.2012 23:47:28)

Неактивен

 

#12 18.01.2012 00:07:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как переписать запрос на поиск

Давайте на примере таблиц из 5го поста

Если вы посмотрите результат выполнения запроса:

SELECT topics.topics_id
FROM topics, comments
WHERE comments.topic = topics.topics_id;
то увидите, что выбраны только темы имеющие комментарии. Что выбрать все темы нужно использовать left join

SELECT topics.topics_id, comment_id
FROM topics left join comments
on comments.topic = topics.topics_id;


Относительно вашего последнего запроса - учтите, что при группировке нельзя выбирать поля по каторым не делается группировка без групповых функций (count, max, min, ...)

Неактивен

 

#13 18.01.2012 00:30:38

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Спасибо за разъяснения.
Завтра утром постараюсь переписать свой запрос.

Не понимаю сути последнего предложения. Какие поля попадают под это определение?

Неактивен

 

#14 18.01.2012 00:34:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как переписать запрос на поиск

SELECT topics.topics_id, comment_id
FROM topics left join comments
on comments.topic = topics.topics_id group by topics_id;
Нельзя, так как по comment_id нет группировки или групповой функции.

Можно
SELECT topics.topics_id, count(comment_id)
FROM topics left join comments
on comments.topic = topics.topics_id group by topics_id;

Неактивен

 

#15 18.01.2012 00:45:01

wine-time
Завсегдатай
Зарегистрирован: 17.06.2011
Сообщений: 42

Re: Как переписать запрос на поиск

Ага, вот оно значит что...
Спасибо вам большое. Даже не представляю, сколько времени вы помогли мне спасти )

Неактивен

 

Board footer

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