Mysql "Порядок действий" Вопрос - PullRequest
2 голосов
/ 04 августа 2009

Вот моя ситуация: я хочу ВЫБРАТЬ все записи из базы данных, ГДЕ id = $ id. Но я хочу, чтобы результаты были перечислены в определенном приоритете. Если критерий = $ критерий, то я хочу, чтобы эти результаты отображались первыми. В противном случае я просто хочу продолжать отображать остальные строки.

Мой вопрос таков: решит ли это мою проблему?

SELECT field1 WHERE (criteria=$criteria AND id = $id) OR id=$id  LIMIT 5 

Будет ли запрос сначала смотреть на ()? Если нет, есть ли другой способ сделать это, не разбивая его на два отдельных запроса?

Спасибо
Michael

Ответы [ 3 ]

5 голосов
/ 04 августа 2009
SELECT  field1
FROM    mytable
WHERE   id = $id
ORDER BY
        criteria = $criteria DESC, id
LIMIT 5

, или это:

SELECT  *
FROM    (
        SELECT  field1
        FROM    mytable
        WHERE   id = $id
                AND criteria = $criteria
        ORDER BY
                id
        LIMIT 5
        ) q
UNION
FROM    (
        SELECT  field1
        FROM    mytable
        WHERE   id = $id
        ORDER BY
                id
        LIMIT 5
        ) q2
ORDER BY
        criteria = $criteria DESC, id
LIMIT 5

Последнее более эффективно, если у вас есть индекс на (id, criteria) (в этом порядке).

0 голосов
/ 04 августа 2009
SELECT field1
  FROM mytable
 WHERE id = $id
 ORDER BY CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE
 LIMIT 5;

В этом списке будут перечислены строки, соответствующие критериям до тех, которые не соответствуют нулю, потому что ноль предшествует единице.

Если это не сработает напрямую - как написано - поместите информацию в подзапрос:

SELECT field1
  FROM (SELECT field1,
               CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE AS ordering
          FROM mytable
         WHERE id = $id
       ) AS subqry
 ORDER BY ordering
 LIMIT 5;

Часто для определения порядка строк в пределах порядка 0 против 1 будут использоваться другие вторичные критерии.

0 голосов
/ 04 августа 2009

Не относится к исходному вопросу, просто чтобы уточнить: оператор AND имеет более высокий приоритет, чем OR, поэтому a или b и c или d равны a или (b и c) или d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...