2016-04-11 4 views
0

i'am пытается получить следующую информацию из таблицы:MySQL Query - Смесь сортировки и группировки

  • сортировка по «Ъ» (таблица А по возрастанию, по убыванию таблице B)
  • все «U «с конкретным значением появляется первое (в этом примере u = 3) - тогда порядок не важен
  • N (NULL) всегда в конце
  • no« r »может происходить дважды (но все разные« r », должны присутствовать)

С "ORDER BY IFNULL (u, 99999999)! = 3, u, b" критерий 1, 2 и 3 работает, но для последнего я понятия не имею.

С DISTINCT Я не достигаю цели, так же как и GROUP BY.

У кого-нибудь есть идеи? Большое спасибо заранее.

start table   target table A 
+----------------+ +----------------+ 
| id | r | u | b | | id | r | u | b | 
+----------------+ +----------------+ 
| 1 | 1 | 1 | 9 | | 18 | 5 | 3 | 1 | 
| 2 | 1 | 3 | 4 | | 2 | 1 | 3 | 4 | 
| 3 | 1 | 4 | 6 | | 15 | 4 | 3 | 7 | 
| 4 | 1 | 5 | 5 | | 11 | 3 | 3 | 8 | 
| 5 | 2 | 1 | 2 | | * | 2 | * | * | 
| 6 | 2 | 2 | 1 | | 21 | 6 | N | N | 
| 7 | 2 | 4 | 5 | +----------------+ 
| 8 | 2 | 5 | 7 | 
| 9 | 3 | 1 | 4 | 
| 10 | 3 | 2 | 3 | 
| 11 | 3 | 3 | 8 | 
| 12 | 3 | 5 | 2 | target table B 
| 13 | 4 | 1 | 3 | +----------------+ 
| 14 | 4 | 2 | 2 | | id | r | u | b | 
| 15 | 4 | 3 | 7 | +----------------+ 
| 16 | 4 | 4 | 6 | | 11 | 3 | 3 | 8 | 
| 17 | 5 | 2 | 9 | | 15 | 4 | 3 | 7 | 
| 18 | 5 | 3 | 1 | | 2 | 1 | 3 | 4 | 
| 19 | 5 | 4 | 6 | | 18 | 5 | 3 | 1 | 
| 20 | 5 | 5 | 4 | | * | 2 | * | * | 
| 21 | 6 | N | N | | 21 | 6 | N | N | 
+----------------+ +----------------+ 
+0

Как вы выбираете, какие строки брать, когда есть более 2 значения на 'столбце r'? И я не уверен, что понял вас, это 'targetA' и' targetB' вывод 'StartTable'? – sagi

+1

Можете ли вы показать свой код? –

+0

Начальная таблица - таблица в db, а целевые таблицы - мои желаемые результаты. – Seamanx

ответ

2
SELECT * 
FROM mytable m 
WHERE id = 
     (
     SELECT id 
     FROM mytable mi 
     WHERE mi.r = m.r 
     ORDER BY 
       u IS NULL, u = 3 DESC, b, id 
     LIMIT 1 
     ) 
ORDER BY 
     u IS NULL, u = 3 DESC, b 

Update:

SELECT * 
FROM objects o 
LEFT JOIN 
     ratings r 
ON  r.id = COALESCE(
     (
     SELECT id 
     FROM ratings 
     WHERE object_id = o.id 
       AND user_id = :myuser 
     ORDER BY 
       rating DESC 
     LIMIT 1 
     ), 
     (
     SELECT id 
     FROM ratings 
     WHERE object_id = o.id 
     ORDER BY 
       rating DESC 
     LIMIT 1 
     ) 
     ) 
+0

Спасибо, это работает! – Seamanx

+0

Имеет ли это строительство специальное название? Я хочу это понять, но я не могу! – Seamanx

+0

@Seamanx: коррелированный подзапрос, я считаю. Во всех других основных системах вы бы просто использовали функцию ROW_NUMBER, window, но MySQL ее не поддерживает. – Quassnoi

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