Я просмотрел группу с наибольшей группой n-group и не могу найти этот ответ и не могу заставить решения JOIN работать с WHERE CLAUSE. Вот что у меня есть.
Таблица t1:
ID Product_Name Quantity pharmacyShort Copay_Amount
581284 AMLODIPINE 10 MG 30 WALGREENS 21.07
581283 AMLODIPINE 10 MG 30 CVS 36.61
581282 AMLODIPINE 10 MG 28 RITE AID 30.98
581280 AMLODIPINE 10 MG 60 WALGREENS 50.65
581279 AMLODIPINE 10 MG 30 CVS 29.78
581278 AMLODIPINE 10 MG 30 RITE AID 14.28
581277 AMLODIPINE 10 MG 180 WALGREENS 33.83
581276 AMLODIPINE 10 MG 15 CVS 18.33
581275 AMLODIPINE 10 MG 10 RITE AID 45.93
581274 AMLODIPINE 10 MG 30 PUBLIX 33.75
У меня также есть таблица приоритетов, назовите ее t2, на которой я хочу, чтобы результат был приоритетным (отсортированным):
id pharmacyShort COUNT
1 CVS 100
2 RITE AID 99
3 TARGET 98
4 WALGREENS 97
5 WALMART 96
6 KMART 95
7 KROGER 94
8 PUBLIX 93
MYSQL:
SELECT t1.pharmacyShort , t1.Copay_Amount
FROM 't1'
INNER JOIN 't2'
ON t1.pharmacyShort = t2.pharmacyShort
WHERE t1.Product_Name = 'AMLODIPINE 10 MG'
AND t1.Quantity = '30'
AND t1.ID > 555000
GROUP BY t1.pharmacyShort
ORDER BY t2.COUNT DESC LIMIT 30
У меня есть идентификатор> 555000, чтобы сократить время запроса. Кроме того, я пытаюсь показать самые последние цены. Возможно, это можно сделать с помощью ORDER BY, но проблема состоит в том, что у некоторых препаратов есть больше претензий, в то время как у других гораздо меньше, что означает, что мне нужно идти назад вовремя, чтобы получить цену.
То, что я надеюсь получить, это (на самом деле мне нужны только столбцы pharmacyShort и Copay_Amount на выходе, но для ясности оставлены остальные столбцы):
581283 AMLODIPINE 10 MG 30 CVS 36.61
581284 AMLODIPINE 10 MG 30 WALGREENS 21.07
581278 AMLODIPINE 10 MG 30 RITE AID 14.28
581274 AMLODIPINE 10 MG 30 PUBLIX 33.75
Вывод должен отображать только CVS с ID 581283 и показывать только одно требование от CVS, но вместо этого (как я узнал) GROUP BY выбирает более старую заявку, 581279, вот так:
581279 AMLODIPINE 10 MG 30 CVS 29.78
581284 AMLODIPINE 10 MG 30 WALGREENS 21.07
581278 AMLODIPINE 10 MG 30 RITE AID 14.28
581274 AMLODIPINE 10 MG 30 PUBLIX 33.75
Если это упростит, я могу жить без таблицы приоритетов. Я также подумал о том, чтобы попытаться позаботиться об этом на стороне PHP некоторым видом массива, но я думаю, что MYSQL будет быстрее.
Большое, большое спасибо и хорошая карма всем, что может помочь.
ОБНОВИТЬ:
Основываясь на ответах, которые я получил, вот где я:
SELECT a.pharmacyShort, a.copay_amount
FROM 't1' a
JOIN (SELECT MAX(ID) as maxid, pharmacyShort
FROM 't1'
WHERE Product_Name = 'AMLODIPINE 10 MG'
AND Quantity = '30'
GROUP BY pharmacyShort) AS maxt1
ON a.pharmacyShort = maxt1.pharmacyShort AND a.id = maxt1.maxid
join t2 b ON a.pharmacyShort = b.pharmacyShort
ORDER BY b.count DESC
LIMIT 20
Я удалил из предложения WHERE id> 550000, потому что, используя MAX (ID), я не думаю, что мне это понадобится.
Но я получаю нулевой набор результатов. Так где я иду не так?
Использовать соединение с простым групповым идентификатором, метод Sub-query max-value-in-group в SQL выбирает только строки с максимальным значением в столбце и помещает условия в подзапрос.
Затем присоединитесь к этому с помощью t2
чтобы получить столбец count
для упорядочения.
SELECT t1.pharmacyShort, t1.copay_amount
FROM t1
JOIN (SELECT pharmacyShort, MAX(id) AS maxid
FROM t1
WHERE Product_Name = 'AMLODIPINE 10 MG'
AND Quantity = '30'
AND ID > 555000
GROUP BY pharmacyShort) AS maxt1
ON t1.pharmacyShort = maxt1.pharmacyShort AND t1.id = maxt1.maxid
JOIN t2 on t1.pharmacyShort = t2.pharmacyShort
ORDER BY t2.count DESC
LIMIT 20
SELECT a.ID, a.pharmacyShort FROM t1 a INNER JOIN ( SELECT pharmacyShort, MAX( id ) id FROM t1 GROUP BY pharmacyShort ) b ON a.pharmacyShort = b.pharmacyShort AND a.id = b.id LIMIT 150 , 30