[SQL] Приоритет условия

uncle17

Есть примерно такая выборка:

SELECT fields
FROM table
WHERE (w1 AND !w2) OR w2
LIMIT 20

Нужно, чтобы в выборку обязательно попало то, что w2
Самый простой способ - юнион:

(SELECT fields
FROM table
WHERE w2)
UNION
(SELECT fields
FROM table
WHERE w1 AND !w2
LIMIT 19)

А можно проще?

Marinavo_0507

order by добавить?
а условие твоё эквивалентно (w1 OR w2)

uncle17

а условие твоё эквивалентно (w1 OR w2)
Неа
Если без LIMIT, то да, а нужно, чтобы w2 точно попало.
А так он может набрать 20 w1 и отдать

Marinavo_0507

первую строчку не прочитал?

uncle17

В общем случае, конечно эквивалентно

uncle17

а order by чему?

Marinavo_0507

ну по тому, чтоб w2 было в начале
есть всякие функции типа if

uncle17

аха... точно. Перед лимитом же всё равно полная выборка делается. Так?

SELECT fields, (CASE IF w2 THEN 1 ELSE 0 END) AS some_order
FROM table
WHERE w1 OR w2
ORDER BY some_order DESC
LIMIT 20

Marinavo_0507

если хочешь максимальную производительность то надо наверное хранимую процедуру писать чтоб склеивала из двух запросов результат - она же пропустит второй запрос совсем, если он не нужен
ещё если нужно делать быстро такие выборки, то можно флаги закодировать одним числовым параметром и сделать по нему индекс
но я как бы не настоящий спец, они наверное что-то более энтерпрайзное могут посоветовать, для бигдаты и 100000 серверов

uncle17

Да не, индексов там хватает. Это не частый запрос будет и бигдаты там не предвидится, а order by там и так присутствует, так что ничего страшного, вполне сойдет.

sgalexandra

When using LIMIT, it is important to use an ORDER BY clause that constrains the result rows into a unique order. Otherwise you will get an unpredictable subset of the query's rows.

uncle17

да есть там ORDER BY

hwh2010

SELECT fields, (CASE IF w2 THEN 1 ELSE 0 END) AS some_order FROM table WHERE w1 OR w2 ORDER BY some_order DESC LIMIT 20
некоторые субд разрешают писать прямо order by w2
(при этом false<true)

kill-still

это не по дзену :umnik:
FROM
ON
JOIN
where
GROUP BY
WITH CUBE или WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Оставить комментарий
Имя или ник:
Комментарий: