2010-02-13 25 views
5

Bu çok mantıklı olmayabilir, ancak WHERE IN maddesinde yinelenen ölçütler varsa MySQL'in tam yinelenen satırları döndürmesine izin vermek isterim. Mümkün mü? MySQL'i, JOINT/UNION kullanmadan WHERE IN yan tümcesi kopyalarını döndürmek için zorla?

bu örneği ele alalım: MySQL gibi

SELECT 
    columns 
FROM 
    table 
WHERE 
    id IN(1, 2, 3, 4, 5, 1, 2, 5, 5) 

I'ld kez kimlikli bana 5 üç id en 1 ve 2 kez kez, ve 3. ve 4. satırları döndürmek için. IN argümanlar uzunluğundan yanı sıra yinelenen sayımı (bir, iki, üç kez, vs.) gibi

, ben UNION veya JOIN güvenmek istemiyorum keyfi olacaktır. Aksi takdirde böyle bir şey mümkün mü?

cevap

2

JOIN'i neden SQL için oldukça önemli olarak yasaklamak istediğinizden emin değilim. İşlevsel bir dilde işlev çağrılarını yasaklamak gibi.

Bunu çözmenin iyi bir yolu, geri dönmek ve ona katılmak istediğiniz kimlikleri içeren bir sonuç kümesi oluşturmaktır. İşte bunu yapmanın bir yolu:

SELECT Table1.* 
FROM Table1 
JOIN (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 5 
     UNION ALL SELECT 5) AS T1 
ON Table1.id = T1.id 

Bu yöntemi düşündüğünüzden emin değilim? Korktuğunuz problemlerden hiçbirine sahip değil.

Birleştirme işlemini yasaklarsanız, bir saklı yordamı kullanmadığınız sürece bunu yapamazsınız;

+0

Merhaba İşareti, cevabınız için teşekkürler. Şeylerin bakışlarına göre, o zaman sadece JOIN ve UNION ile gitmek zorunda kalacağım. Burada kullandığınız gibi UNION'un kullanımının farkında değildim. Tamamen anladığımdan bile emin değilim. :) Ama çok şık görünüyor! UNION'u ilk başta kullanmak istemediğim nedeni, kesin SELECT ifadelerini tekrar etmem gerektiğini düşündüğümden kaynaklanıyor. Bu olsa çok daha temiz görünüyor. –

+0

Bu arada, bu UNION'lar sonucun kesin sırasını garanti edecekler mi, yoksa açıklamada yer aldıkları şekilde tam olarak sipariş vermek için bir ORDER maddesini kullanmaya devam etmem gerekecek mi? –

+0

Sipariş vermek için * siparişe ihtiyacınız var. Bu her zaman doğrudur. Neyse ki yukarıdaki sorguyu değiştirmek kolay: 'SELECT 1 ID olarak, 1 SortOrder UNION TÜM SEÇİMİ 2, 2 UNION TÜM SEÇİMİ 3, 3' vb. Sonra' ORTAK BY DİZİ… ON ... '. –