MySQL: Как упорядочить результаты в зависимости от того, присутствуют ли они также в других таблицах? - PullRequest
1 голос
/ 03 июня 2011

MySQL (упрощенные таблицы)

table_1

+----+-------+
| id | title |
+----+-------+
| 1  | test  |
+----+-------+
| 2  | test  |
+----+-------+
| 3  | test  |
+----+-------+

table_2

+----+
| id |
+----+
| 1  |
+----+

table_3

+----+
| id |
+----+
| 1  |
+----+
| 3  |
+----+

PHP

$a = mysql_query("SELECT t1.id FROM table_1 AS t1 WHERE MATCH(t1.title) AGAINST ('test' IN BOOLEAN MODE)");

Что я хочу сделать сейчас:

a) Если id включено в table_2 ИЛИ table_3, его следует оценивать выше, чем если бы оно присутствовало только в table_1

b) Если id включено в table_2 И table_3, оно должно быть ранжировано еще выше

Итак, вывод должен быть:

1, 3, 2

Ответы [ 2 ]

1 голос
/ 03 июня 2011
SELECT a.id 
FROM table_1 a
LEFT JOIN table_2 b ON b.id = a.id
LEFT JOIN table_3 c ON c.id = a.id
ORDER BY
    b.id IS NOT NULL AND c.id IS NOT NULL DESC,
    b.id IS NOT NULL OR c.id IS NOT NULL DESC

Вы можете объявить последующие заказы того, что делать, если несколько записей имеют одинаковый приоритет

1 голос
/ 03 июня 2011
select table_1.id, 
  (case
  when max(table_2.id) is not null AND max(table_3.id) is not null then 0
  when max(table_2.id) is not null OR max(table_3.id) is not null then 1
  else 2
  end) rank
from table_1 left outer join table_2 on
   table_1.id = table_2.id left outer join table_3 on
   table_1.id = table_3.id
group by table_1.id
order by rank
...