2015-04-29 21 views
7

Tablo:SQL Select satırları nerede Durumu

 
| id | productId | orderIndex | rejected | 
------------------------------------------ 
| 1 | 1  | 0  | 1  | 
| 2 | 1  | 1  | 0  | 
| 3 | 1  | 2  | 0  | 
| 4 | 2  | 0  | 0  | 
| 5 | 2  | 1  | 1  | 
| 6 | 3  | 0  | 0  | 

nasıl reddetmediğiniz asgari orderIndex ile productId başına bir satır seçebilir?

Beklenen sonuç:

 
SELECT id, productId, min(orderIndex) 
FROM table 
WHERE rejected = 0 
GROUP BY productId 

Bu seferki de çalışmaz:: Ben bu sorguyu çalıştı, ancak doğru sonucu alınan yok

 
| id | productId | orderIndex | rejected | 
------------------------------------------ 
| 2 | 1  | 1  | 0  | 
| 4 | 2  | 0  | 0  | 
| 6 | 3  | 0  | 0  | 

 
SELECT id, productId, min(orderIndex) 
FROM (
    SELECT id, productId, orderIndex 
    FROM table 
    WHERE rejected = 0 
) t 
GROUP BY productId 
+1

beklenen sonuçlar nelerdir? – AdamMc331

+0

Ayrıca, başlığınız maksimum değer diyor, ancak sorunuzdaki her şey en azını ifade ediyor. İhtiyacınız olan şeyi öğrendikten sonra lütfen başlığı veya soruyu uygun şekilde düzenleyin. – AdamMc331

+0

Soru düzeltildi. – Degibons

cevap

7

Sen

012: Bu gibi reddedilmeyen ürünlerin minimum orderIndex seçerek başlayabilirsiniz
SELECT productId, MIN(orderIndex) 
FROM myTable 
WHERE rejected = 0 
GROUP BY productId; 

sen productId ve minOrderIndex maçı şartıyla orijinal tablodan ile katılmasının mümkün olmadığı olduğunda:

SELECT m.id, m.productId, m.orderIndex 
FROM myTable m 
JOIN(
    SELECT productId, MIN(orderIndex) AS minOrderIndex 
    FROM myTable 
    WHERE rejected = 0 
    GROUP BY productId) tmp ON tmp.productId = m.productId AND tmp.minOrderIndex = m.orderIndex; 

Benim sorgu hiçbir yinelenen orada olduğu varsayımını yapar (productId, orderIndex) çiftleri. Bu var olmadıkça, bu sadece iyi çalışır. İşte bir SQL Fiddle örnek.

+0

Doğru hatırladığımdan emin değilim. Sadece “JOIN” 'i kullandığınızda MySQL' LEFT JOIN' olarak burada ihtiyacımız olmayan bir şey olarak yorumluyor. Burada 'ORTAK JOIN' kullanmayı öneririm. – Alex

+0

Hayır, kendi başına bir iç birleştirme olarak yorumlanır. – AdamMc331

+1

Bu iyi çalışıyor, yardım için teşekkürler! – Degibons

0

http://sqlfiddle.com/#!9/0196f/2

SELECT DISTINCT t.* 
FROM table1 t 
INNER JOIN (
SELECT productId, min(orderIndex) minIdx 
FROM table1 
WHERE rejected = 0 
GROUP BY productId 
) t1 
ON t.productId = t1.productId 
    AND t.orderIndex = t1.minIdx; 
İlgili konular