Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Есть две таблицы:
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 - строка будет выбрана. Каким образом добавить условие, что неопределённое значение тоже надо выбрать?
Неактивен
or value is null
Неактивен
Спасибо большое, помогло!
А ещё вопрос:
До вызова непосредственно селекта данных мне надо определить количество строк (для определения количества страниц).
После использования оператора GROUP BY уже не проканывает SELECT COUNT(*) FROM table1 LEFT JOIN....
Возварщается несколько строк, каждая из которых содержит количество сгруппированных.
Каким образом создать запрос, возвращающий одну строку, содержащую только количество записей, удовлетворяющих условию?
Неактивен
MaxZol написал:
После использования оператора GROUP BY уже не проканывает SELECT COUNT(*) FROM table1 LEFT JOIN....
Возварщается несколько строк, каждая из которых содержит количество сгруппированных.
Используйте WITH ROLLUP
http://dev.mysql.com/doc/refman/5.1/en/ … fiers.html
Неактивен
На сколько я понял из мануала этот оператор всё равно производит выборку всех строк и только в конце подводит итог. А мне как раз не надо выбирать всё, это не рационально, так как php получит полный набор данных (не малый набор) вместо одной строчки с количеством.
Неактивен
vasya написал:
or value is null
Перенос условия из WHERE под ON тоже подойдет?
Неактивен
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, вобщем-то хорошо подходит
Неактивен
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();
Неактивен
vaspet написал:
Перенос условия из WHERE под ON тоже подойдет?
SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.t1id AND table2.value<2.5
Нет. В данном случае будут выбраны строки, имеющие value>=2.5, при этом всем значениям второй таблицы будут присвоены null.
Наглядный пример:
Неактивен
MaxZol написал:
Нашёл ответ сам:
необходимо выполнить необходимый запрос с лимитом 0, а затем FOUND_ROWS();
SELECT SQL_CALC_FOUND_ROWS id FROM ...... GROUP BY tovar.tid LIMIT 0
SELECT FOUND_ROWS();
Т.е. до выборки данных вы выполняете 2 запроса; а потом ещё и сами данные выбираете, фактически повторяя первый запрос.
Не рациональней выполнить всего один запрос на выборку данных с with roolup?
Неактивен
@vasya спасибо
Неактивен
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. В моём варианте я хотя бы не заставляю передавать данные обратно.
Неактивен