2016-10-09 2 views
2

я 2 таблицы в моей схемеКак сортировать результат на основании записи в другой таблице

Таблица A

+----+------+------+------+ 
| id | col1 | col2 | col3 | 
+----+------+------+------+ 
| 1 | abc | NULL | abc | 
| 2 | abc | NULL | NULL | 
| 3 | NULL | abc | abc | 
+----+------+------+------+ 

Таблица B

+------+------+------+ 
| col1 | col2 | col3 | 
+------+------+------+ 
| NULL | abc | abc | 
| abc | NULL | abc | 
| abc | abc | abc | 
+------+------+------+ 

Я хочу, чтобы выбрать все записи в таблице А и отсортировать их, если он имеет тот же элемент в таблице 2.

В этом случае я отвечу

+----+------+------+------+ 
| id | col1 | col2 | col3 | 
+----+------+------+------+ 
| 1 | abc | NULL | abc | 
| 3 | NULL | abc | abc | 
| 2 | abc | NULL | NULL | 
+----+------+------+------+ 

Любая помощь или понятие было бы оценено

+0

Что произойдет, если таблица B содержит более одной записи? –

+0

Независимо от того, какие строки, которые соответствуют таблице2, должны быть в верхней части результирующего ответа. –

+0

Это на самом деле не отвечает на мой вопрос, поэтому, я думаю, я попрошу еще раз. Что произойдет, если таблица B содержит более одной записи? –

ответ

1

Что-то, как это должно работать:

SELECT id, col1, col2, col3 
FROM (
    SELECT id, col1, col2, col3, matches, 
      @seq := IF(@id = id, @seq + 1, 
        IF(@id := id, 1, 1)) AS seq 
    FROM (
     SELECT t1.id, t1.col1, t1.col2, t1.col3, 
      IF(t2.col1 IS NULL, 0, 1) + IF(t2.col2 IS NULL, 0, 1) + 
      IF(t2.col3 IS NULL, 0, 1) AS matches 
     FROM tableA AS t1 
     LEFT JOIN tableB AS t2 
     ON COALESCE(t1.col1,0) = COALESCE(t2.col1,0) OR 
      COALESCE(t1.col2,0) = COALESCE(t2.col2,0) OR 
      COALESCE(t1.col3,0) = COALESCE(t2.col3,0)) AS t 
    CROSS JOIN (SELECT @seq := 0, @id :=0) AS vars   
    ORDER BY id, matches DESC ) AS x 
WHERE x.seq = 1 
ORDER BY x.matches DESC, x.id 

Запрос использует LEFT JOIN операцию с OR операторов в предложении ON, чтобы получить все возможные совпадения каждой записи tableA с каждой записью tableB. Переменные используются для получения наилучшей подходящей записи tableA за id. Результат упорядочивается по количеству совпадений каждой записи tableA.

Demo here

Примечание: Запрос предполагает, что col1, col2, col3 никогда не принимают значение 0.

+0

Могу ли я также иметь число строк, сопоставляемых с таблицей b для каждой строки таблицы A в качестве нового столбца в ответе? так что строки, которые не совпадают с таблицей b, будут иметь счет как 0? –

+0

@SamuelRobert Да, мой запрос использует для этого поле 'matches'. Просто добавьте его в предложение SELECT. –

+0

Большое спасибо !!! –

Смежные вопросы