ВЫБЕРИТЕ с GROUP_CONCAT, GROUP BY, HAVING - PullRequest
4 голосов
/ 27 октября 2011

У меня есть таблица с odd_id, и я хочу выбрать комбинации для разных ticket_id. Вот мой запрос:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id

И это дает мне следующее:

'28', '14472510,14472813,14472546,14472855,14472746,14472610,14472647'
'29', '14471149,14471138,14471125,14475603'
'30', '14471823,14471781,14471655,14471865,14471597,14471968,14471739,14471697,14471923'
'31', '14473874,14473814,14473862,14473838,14473790,14473802,14473826,14473850'
'32', '14471588,14472766,14471651,14471777,14471419'
'33', '14472647,14472605,14471650,14471734'
'34', '14471588,14472704,14471817'
'35', '14475279,14474499'
'282', '14472756,14472652,14472813'
'283', '14471588,14472766,14471419,14471777,14471651'
'284', '14474521'
'285', '14474529'
'286', '14474547'
'287', '14471134,14471199,14473636,14471242,14471398,14471237'

Но если я использую функцию «Функция», это не даст мне результатов. Понятно: это дает мне следующее:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id
HAVING oddsconcat = '14475279,14474499'

Возвращает ticket_id 35, и все довольны, и код работает нормально, но если oddsconcat больше, чем этот, он не возвращает никакого значения. Например:

SELECT
ticket_id,
GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
GROUP BY ticket_id
HAVING oddsconcat = '14473874,14473814,14473862,14473838,14473790,14473802,14473826,14473850'

Ответы [ 2 ]

15 голосов
/ 27 октября 2011

Я бы переписал его как:

SELECT 
ticket_id, 
GROUP_CONCAT(DISTINCT odd_id ORDER BY odd_id ASC) as oddsconcat 
FROM ticket_odds 
GROUP BY ticket_id 
HAVING oddsconcat = .....

Теперь вывод в oddsconcat является детерминированным, потому что дубликаты удаляются, а элементы располагаются в порядке возрастания.
Это должно значительно упростить сопоставление.

1 голос
/ 27 октября 2011

Если предположить, что комбинация (ticket_id, odd_id) равна UNIQUE, это даст вам все билеты, которые содержат эти два шанса (и, возможно, больше других шансов):

SELECT
  ticket_id,
  GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
WHERE odd_id IN (14475279,14474499)
GROUP BY ticket_id

И это даст вам все билеты, которыесодержат ровно эти два шанса (и никаких других):

SELECT
  ticket_id,
  GROUP_CONCAT(odd_id) as oddsconcat
FROM ticket_odds
WHERE odd_id IN (14475279,14474499)     --- list
GROUP BY ticket_id
HAVING COUNT(*) = 2                     --- size of list
...