2012-03-13 6 views
0

Мне нужно выбрать записи «bundle» из приведенной ниже таблицы, но только в том случае, если в пакете существует другой мудрый трек 1 из каждой версии. Каждый выпуск имеет уникальную «cat_no», поэтому мне нужно использовать GROUP BY.MYSQL GROUP BY BY AND ORDER BY с ABS

SELECT * FROM cds 
WHERE genre='rock' 
GROUP BY cat_no 
ORDER BY ABS(track) DESC 
LIMIT 0,3 

Это то, что я пробовал, но иногда я получаю след 1, когда есть комплект для этой версии.

Таблица

genre cat_no track 
rock 001  1  
rock 001  2  
rock 001  bundle 
rock 002  1  
rock 002  2  
rock 002  bundle 
rock 003  1  
rock 003  2  

ответ

1

Try сортировать записи до группировки -

SELECT * FROM 
    (SELECT * FROM cds WHERE genre = 'rock' ORDER BY IF(track = 'bundle', 0, 1)) t 
GROUP BY 
    cat_no; 
+0

Спасибо, что сработал, но можете ли вы объяснить, что означает «t», и я предполагаю, что трек = 'bundle', 0, 1 - это порядок приоритета? – user1209203

+0

1. 't' - это псевдоним подзапроса (MySQL ему нужен); 2. Да, IF (...) используется для размещения «пучка» перед другими «грузовыми» номерами. – Devart

+0

Спасибо, что я прочитаю о поджиданиях – user1209203

0

Попробуйте это:

select genre, cat_no, max(track) from t 
where track in ('1', 'bundle') 
group by genre, cat_no 

Мы фактически пользуясь порядка ('расслоения' появляется после «1»). Я не понимаю ABS на ходу ... в чем его намерение?

Учитывая ваш пример данных, предыдущий запрос приведет:

+-------+--------+--------+ 
| GENRE | CAT_NO | TRACK | 
+-------+--------+--------+ 
| rock |  1 | bundle | 
| rock |  2 | bundle | 
| rock |  3 | 1  | 
+-------+--------+--------+ 

Позвольте мне знать, если это помогает.