2016-06-14 58 views
0

2つのサブクエリなしでこの単純なことを実行する方法はありますか?MySQL GROUP BYフィールドの不一致

これが私の基本的なデータである:

SELECT order_detail_id, product_id, MAX(paid_price) AS max_price, order_id 
FROM t_order_details 
WHERE order_id = 7 OR order_id = 8 
GROUP BY order_id 

simple select result

私はorder_detail_id選択し、データがないと思われるため8に順序7と同じことで、最高価格でPRODUCT_IDたいです一致行

SELECT order_detail_id, product_id, MAX(paid_price) AS max_price, order_id 
FROM t_order_details 
WHERE order_id = 7 OR order_id = 8 
GROUP BY order_id 

wrong result

これは2つのサブクエリを使用した私のソリューションです。

SELECT order_detail_id, product_id, paid_price, order_id 
FROM t_order_details 
WHERE paid_price IN (
    SELECT MAX(paid_price) AS max_price 
    FROM t_order_details 
    WHERE order_id = 7 OR order_id = 8 
    GROUP BY order_id) 
AND order_id IN (
    SELECT order_id 
    FROM t_order_details 
    WHERE order_id = 7 OR order_id = 8 
    GROUP BY order_id) 
GROUP BY order_id 

しかし、私は

答えて

0

次試してみてください、これを行うために、より自然な方法があるはずだと思う。()サブクエリなし)

SELECT T1.order_detail_id, T1.product_id, T1.paid_price, T1.order_id 
FROM t_order_details T1 
INNER JOIN (
    SELECT MAX(paid_price) AS paid_price, order_id 
    FROM t_order_details 
    WHERE order_id IN (7, 8) 
    GROUP BY order_id 
) T2 ON T1.order_id = T2.order_id AND T1.paid_price = T2.paid_price 
WHERE T1.order_id IN (7, 8) 

編集:

SELECT T1.order_detail_id, T1.product_id, T1.paid_price, T1.order_id 
FROM t_order_details T1 
INNER JOIN t_order_details T2 
ON T1.order_id = T2.order_id AND T1.paid_price <= T2.paid_price 
WHERE T1.order_id IN (7, 8) 
GROUP BY T1.order_id, T1.order_detail_id, T1.product_id 
HAVING COUNT(*) <= 1 
+0

作品!これは私よりも優れています。しかし、サブクエリを使わなくてもそれができることを願っています。非常に一般的な問題ですので、 –

+0

@AndreyKudriavtsev **編集**の部分チェックが動作するかどうかを確認してください。 – Blank