SQL - порядок по заявлению - PullRequest
       7

SQL - порядок по заявлению

5 голосов
/ 28 октября 2011

У меня есть такие таблицы:

table A
id name   email
1  test1  ex@ex.com
2  test2  ex@ex.com
3  test3  ex@ex.com
4  test4   ....
5  test5   ....

table B
id catA    catB   year member 
1  false   true   2011  2
2  true    false  2011  3
3  fals    true   2010  5

И я хочу получить каждую строку в таблице А и отсортировать ее следующим образом:

FIRST, get user 2 (current year, based on table B)
SECOND, get user 3 (current year, based on table B)
after that get users that is in table B
after that get all other users.

Я знаю, что могу иметьконкретный sql для получения первых двух пользователей, а остальным просто.Но разве я не смогу получить их все с хорошим ЗАКАЗОМ по заявлению?Например, ограничение первого оператора порядка только на первую строку ...

Ответы [ 3 ]

4 голосов
/ 28 октября 2011

Как то так?

select A.id, A.name, A.email, B.catA, B.catB, B.year
from A
join B on A.id = B.member
ORDER BY B.year DESC, (B.member IS NOT NULL) DESC

Сначала отсортируйте все результаты по полю года в таблице B, в котором вы получите данные 2011, 2010 и т. Д. ... Все участники, НЕ перечисленные в таблице B, будут иметь нулевой год и отсортированы в нижней части списка. Следующая сортировка по B.member не является нулевой - mysql преобразует этот логический результат в целое число 1 или 0, которое можно отсортировать, поэтому сортируйте по убыванию, чтобы сначала были отсортированы все единицы (не нулевые B.members).

0 голосов
/ 29 октября 2011

Вы всегда можете «упорядочить по», как бы гротескно ни был сложен ваш выбор, купите помещение элементов сбора данных в производную таблицу, выбор из нее и упорядочение по результатам.Что-то вроде ...

SELECT col1,
       col2,
       col3
    FROM
        (SELECT 1 as col1,
                col2,
                ' ' AS col3
             FROM blah...blah...blah
           UNION
         SELECT 2 AS col1
                col2,
                col3
             FROM blah...blah...blah
           UNION
         and so on) myderivedtable
    ORDER BY col1,
             col2,
             col3

Вы просто должны убедиться, что все столбцы, которые вы выбираете в каждом из запросов, совпадают, или в противном случае справиться со значением NULL.

0 голосов
/ 28 октября 2011

Исходя из ваших правил сортировки:

after that get users that is in table B
after that get all other users.

Я предполагаю, что в таблице A есть некоторые пользователи, которых нет в B, поэтому вы хотите использовать LEFT JOIN.

SELECT a.id, a.name, a.email
    FROM a
        LEFT JOIN b
           ON a.id = b.member
    ORDER BY ISNULL(b.year), b.year DESC, a.name
...