MYSQL GROUP BY с, где оговорка

0

Я просмотрел группу с наибольшей группой 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), я не думаю, что мне это понадобится.

Но я получаю нулевой набор результатов. Так где я иду не так?

  • 0
    Как вы определяете «самую последнюю цену»? Там нет даты столбца.
  • 0
    Напишите подзапрос, чтобы получить самую последнюю цену, используя один из методов в вопросе, с которым я связан. Затем соедините это с таблицей приоритетов.
Показать ещё 7 комментариев
Теги:
greatest-n-per-group

1 ответ

0
Лучший ответ

Использовать соединение с простым групповым идентификатором, метод 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
  • 0
    Хорошо, Бармар, пробираюсь через это. Первый шаг, который вы наметите ... РАБОТАЕТ! Я знаю, я шокирован и, вероятно, не должен быть, но я работал над этим часами, так что это прогресс. Далее, шаг 2 ... спасибо !! 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
  • 0
    Проверь это! Мое обновление в верхнем посте на самом деле работает! ОНО РАБОТАЕТ! ОНО РАБОТАЕТ! ОНО РАБОТАЕТ! Черт возьми, какая обезьяна с моей спины. Спасибо, Бармар! От разочарования до радости ... высоко ценится!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню