SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.09.2010 14:13:47

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

LEFT JOIN и недостающие строки

Доброго времени суток!

Есть две таблицы:

table1:

id name
1  name1
2  name2
3  name3

table2:
id t1id value
1    1     2
2    1     2,5
3    2     3

Запрос вида:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.t1id WHERE value<2.5

не вернёт строку с name3, так как для этой строки не определено вообще никакое value. При этом эту строку надо получить, так как подразумевается что отсутствующее значение - это 0.

Если убрать условие WHERE - строка будет выбрана. Каким образом добавить условие, что неопределённое значение тоже надо выбрать?

Неактивен

 

#2 16.09.2010 14:25:51

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

Re: LEFT JOIN и недостающие строки

or value is null

Неактивен

 

#3 16.09.2010 20:22:30

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

Re: LEFT JOIN и недостающие строки

Спасибо большое, помогло!
А ещё вопрос:
До вызова непосредственно селекта данных мне надо определить количество строк (для определения количества страниц).

После использования оператора GROUP BY уже не проканывает SELECT COUNT(*) FROM table1 LEFT JOIN....
Возварщается несколько строк, каждая из которых содержит количество сгруппированных.

Каким образом создать запрос, возвращающий одну строку, содержащую только количество записей, удовлетворяющих условию?

Неактивен

 

#4 16.09.2010 23:45:03

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

Re: LEFT JOIN и недостающие строки

MaxZol написал:

После использования оператора GROUP BY уже не проканывает SELECT COUNT(*) FROM table1 LEFT JOIN....
Возварщается несколько строк, каждая из которых содержит количество сгруппированных.

Используйте WITH ROLLUP
http://dev.mysql.com/doc/refman/5.1/en/ … fiers.html

Неактивен

 

#5 17.09.2010 07:12:20

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

Re: LEFT JOIN и недостающие строки

На сколько я понял из мануала этот оператор всё равно производит выборку всех строк и только в конце подводит итог. А мне как раз не надо выбирать всё, это не рационально, так как php получит полный набор данных (не малый набор) вместо одной строчки с количеством.

Неактивен

 

#6 17.09.2010 12:35:34

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: LEFT JOIN и недостающие строки

vasya написал:

or value is null

Перенос условия из WHERE под ON тоже подойдет?

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.t1id AND table2.value<2.5

Неактивен

 

#7 18.09.2010 14:51:41

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

Re: LEFT JOIN и недостающие строки

vaspet написал:

vasya написал:

or value is null

Перенос условия из WHERE под ON тоже подойдет?

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.t1id AND table2.value<2.5

Да, наверное, но я уже реализовал с is null, вобщем-то хорошо подходит

Неактивен

 

#8 18.09.2010 15:01:58

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

Re: LEFT JOIN и недостающие строки

MaxZol написал:

Спасибо большое, помогло!
А ещё вопрос:
До вызова непосредственно селекта данных мне надо определить количество строк (для определения количества страниц).

После использования оператора GROUP BY уже не проканывает SELECT COUNT(*) FROM table1 LEFT JOIN....
Возварщается несколько строк, каждая из которых содержит количество сгруппированных.

Каким образом создать запрос, возвращающий одну строку, содержащую только количество записей, удовлетворяющих условию?

Нашёл ответ сам:
необходимо выполнить необходимый запрос с лимитом 0, а затем FOUND_ROWS();

SELECT SQL_CALC_FOUND_ROWS id FROM ...... GROUP BY tovar.tid LIMIT 0
SELECT FOUND_ROWS();

Неактивен

 

#9 18.09.2010 15:38:25

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

Re: LEFT JOIN и недостающие строки

vaspet написал:

Перенос условия из WHERE под ON тоже подойдет?

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.t1id AND table2.value<2.5

Нет. В данном случае будут выбраны строки, имеющие value>=2.5, при этом всем значениям второй таблицы будут присвоены null.

Наглядный пример:

create table a(id int);
create table b (id int, qq int);
insert into a values(1),(2),(3),(4);
insert into b values(1,11),(2,12),(3,13);
test >select * from a left join b on a.id=b.id and qq<13;
+------+------+------+
| id   | id   | qq   |
+------+------+------+
|    1 |    1 |   11 |
|    2 |    2 |   12 |
|    3 | NULL | NULL |
|    4 | NULL | NULL |
+------+------+------+
4 rows in set (0.00 sec)

test >select * from a left join b on a.id=b.id where qq<13 or qq is null;
+------+------+------+
| id   | id   | qq   |
+------+------+------+
|    1 |    1 |   11 |
|    2 |    2 |   12 |
|    4 | NULL | NULL |
+------+------+------+
3 rows in set (0.00 sec)

Неактивен

 

#10 18.09.2010 15:43:23

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

Re: LEFT JOIN и недостающие строки

MaxZol написал:

Нашёл ответ сам:
необходимо выполнить необходимый запрос с лимитом 0, а затем FOUND_ROWS();

SELECT SQL_CALC_FOUND_ROWS id FROM ...... GROUP BY tovar.tid LIMIT 0
SELECT FOUND_ROWS();

Т.е. до выборки данных вы выполняете 2 запроса; а потом ещё и сами данные выбираете, фактически повторяя первый запрос.
Не рациональней выполнить всего один запрос на выборку данных с with roolup?

Неактивен

 

#11 18.09.2010 23:32:17

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: LEFT JOIN и недостающие строки

@vasya спасибо

Неактивен

 

#12 19.09.2010 10:27:14

MaxZol
Участник
Зарегистрирован: 16.09.2010
Сообщений: 6

Re: LEFT JOIN и недостающие строки

vasya написал:

MaxZol написал:

Нашёл ответ сам:
необходимо выполнить необходимый запрос с лимитом 0, а затем FOUND_ROWS();

SELECT SQL_CALC_FOUND_ROWS id FROM ...... GROUP BY tovar.tid LIMIT 0
SELECT FOUND_ROWS();

Т.е. до выборки данных вы выполняете 2 запроса; а потом ещё и сами данные выбираете, фактически повторяя первый запрос.
Не рациональней выполнить всего один запрос на выборку данных с with roolup?

До построения запроса на выборку данных мне надо точно знать количество строк, что бы потом правильно расставить LIMIT (постраничный вывод). Поэтому запроса в лбом случае будет 2. В моём варианте я хотя бы не заставляю передавать данные обратно.

Неактивен

 

Board footer

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