MAX ile sorgu seçin

4 Cevap php

Ben büyük bir sorunum var ve ben bütün gün çalışıyordu ve herhangi Çözüm bulamadık. Bana yardımcı olabilir umuyoruz?

İki tablo var:

"Emir" adlı Birincisi:

orders_id | orders_date | .....
1           xxxxxxxxxx
2           xxxxxxxxxx
3           xxxxxxxxxx

İkinci "orders_history" dir:

orders_id | order_status_id | date_added
1           1                 2009-10-01
1           2                 2010-01-01
2           1                 2010-02-01
3           1                 2010-02-01

Yani şimdi ben order_status_id = '1 'tüm siparişleri istiyorum

I have tried with MAX, HAVING, GROUP BY, ... Subselects also, but i haven't found any solution. I know it's not very hard, but i'm finished... Is it something like:

SELECT orders.*, orders_history.* FROM orders, orders_history WHERE orders_history.order_status_id <= '1'

Ama sonra ben de order_id 1 ile Sipariş olsun

Eğer yardımcı olabilir umuyoruz. Teşekkür ederiz!

Sascha

Daha iyi netleştirmek için, web 'orders_history' tablosu zamanla tüm siparişlerin devlet izler. Amaç currently 1 bir sipariş statüsüne sahip tüm siparişler. Sipariş ID # 1 Şu anda 2 durumunu gelmiştir bulacaksınız bir sorgu, bu yüzden sonuçlarına dahil edilmemelidir.

Assumably, sipariş durumu zamanla gider ve sipariş durumu ve date_added sürekli artacak, böylece iner asla.

4 Cevap

Bu sizin için bunu yapmak gerekir:

SELECT * 
FROM orders
   , orders_history
WHERE orders.orders_id = orders_history.orders_id
AND orders.orders_id IN (
  SELECT orders_id 
    FROM orders_history
   GROUP BY orders_id
   HAVING MAX(order_status_id) = 1
)

Ben bu işe alma sorun vardı şaşırmadım - bu sorgu çok zor bir türü bulunuyor nereye 'GROUP BY' zorunluluk ve MAX bulmak ve aynı zamanda aynı satırda tüm diğer ilgili değerleri. Bu yaygın bir istek olduğunu ve genellikle SQL bu ifade aslında oldukça zor olduğunu insanları şaşırtıyor. İşte MySQL bunu yapmanın bir yolu var:

SELECT T2.orders_id FROM (
    SELECT orders_id, MAX(date_added) AS date_added
    FROM orders_history
    GROUP BY orders_id
) AS T1
JOIN orders_history T2
ON T1.orders_id = T2.orders_id AND T1.date_added = T2.date_added
GROUP BY T2.orders_id, T2.date_added
HAVING MAX(order_status_id) = 1

İşte ben varsayıyorum:

  • orders_id, DATE_ADDED benzersiz değil.
  • orders_id, date_added, order_status_id benzersizdir.

Değil, ikinci varsayım doğru değilse, ilk seçtikten sonra DISTINCT ekleyin.

İşte senin test verileri için olsun sonuçlar:

2
3

Her sipariş hakkında ilave bilgi almak istiyorsanız eğer siparişleri masaya bu katılabilirsiniz.

Edited yorumlarda tartışmadan sonra (burada maddesini değiştirdi):

SELECT orders.*, orders_history.* 
FROM orders INNER JOIN orders_history
 ON orders.orders_id = orders_history.orders_id 
WHERE orders.orders_id IN 
   (SELECT orders_id FROM orders_history 
   GROUP BY orders_id 
   HAVING MAX(order_status_id) = 1)
select o.*, oh.* 
from orders o
inner join orders_history oh on oh.orders_id = o.orders_id
where oh_orders_status = 1

hile yapmak gerekir. Ama mysql dokundu çünkü bir süre var, bu nedenle orders_status tırnak içinde olmalıdır eğer ben bilmiyorum - bir int olup olmadığını ben değil tahmin ediyorum ...