LINUX.ORG.RU

Выборка. SQL

 ,


0

1
SELECT `user`.`name`, `text_record`.`date`, MAX(`text_record`.`value`) AS `record` FROM `text_record` JOIN `user` ON `user`.`id` = `text_record`.`user_id` WHERE `text_record`.`user_id` = 1 AND `text_record`.`text_id` = 12 LIMIT 10
+-------+------+----------------------------+
| name  | date | MAX(`text_record`.`value`) |
+-------+------+----------------------------+
| Razip | NULL |                       NULL |
+-------+------+----------------------------+

Как изменить запрос таким образом, чтобы если нужной записи в таблице text_record не существует, то не делался JOIN вообще? Спасибо.

★★

Ответ на: комментарий от bvn13

INNER JOIN не помогает (получается так же, как и в изначальном варианте).

Razip ★★
() автор топика

Попробую угадать, что у тебя в таблице user сейчас одно значение. Иначе твой селект сломался бы, т.к. нет кляуза broup by для агрегатной функции max.

winlook38 ★★
()
Ответ на: комментарий от kiotoze

Это нормально, т.к. max возвращает null, когда нет данных. Значения в других колонках подставились из единственной сроки в user. Если бы в user была бы хотя бы пара строк, он получил бы ошибку.
Если я все это не выдумал, конечно же.

winlook38 ★★
()
Ответ на: комментарий от Razip

Добавь вторую строку, чтобы убедиться, что твой селект не работает. Допиши кляуз goup by `user`.`name`, `text_record`.`date`. Тогда записи, для которых нет соответствий в text_record не будут попадать в выборку.

winlook38 ★★
()
Ответ на: комментарий от Razip

В таблице итак >1 записей.

В какой таблице? Я про user. Если у тебя в user больше одной записи, то я сам плохо понимаю, что у тебя произошло.

Суть в том, что у тебя из связанной таблицы не выбирались записи и max возвращала строку со значением null. При том, что у тебя ошибка в запросе (агрегатные функции должны сопровождаться кляузом group by по полям, которые не агрегируются в выборке), это приводило к тому, что когда у тебя в user одна запись, а max вернул null, ты получаешь одну строку, в которой столбцы из user заполняются значениями единственной записи из этой таблицы, а столбцы из связанной таблицы заполняются null-значениями.

Фух, выдохнул. Звучит как наркоманский приход, но переписать это иначе я уже не смогу.

winlook38 ★★
()
Ответ на: комментарий от winlook38

Блин, я хотел сказать `text_record`. После того как добавил нового пользователя ничего не изменилось - все по прежнему работает.

Razip ★★
() автор топика
Ответ на: комментарий от Razip

все по прежнему работает

Работает кляузом group by? Так и должно быть. Без него - не должно.

winlook38 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.