Bir SQL sorgusu benzersiz veri almak

3 Cevap php

Ben bu formda bazı bilgileri içeren bir veritabanı var:

icon(name, size, tag)
(myicon.png, 16, 'twitter')
(myicon.png, 32, 'twitter')
(myicon.png, 128, 'twitter')
(myicon.png, 256, 'twitter')
(anothericon.png, 32, 'facebook')
(anothericon.png, 128, 'facebook')
(anothericon.png, 256, 'facebook')

Yani gördüğünüz gibi, ad alanı ben aynı ada sahip birden simgeler olabilir ve onlar büyüklük alanı ile ayrılır uniq değildir. Şimdi PHP Örneğin ben ONE simge seti, olsun bir sorgu var:

$dbQueryIcons = mysql_query("SELECT * FROM pl_icon WHERE tag LIKE '%".$SEARCH_QUERY."%' GROUP BY name ORDER BY id DESC LIMIT ".$firstEntry.", ".$CONFIG['icon_per_page']."") or die(mysql_error());

$ Tag 'twitter' içeren bu örnekle etiketi 'twitter' ile SADECE ilk SQL veri girişi gösterir, bu yüzden olacak:

(myicon.png, 16, 'twitter')

Bu ne istiyorum, ama varsayılan olarak '128 'boyutunu tercih ederim. Bu başka bir boyutu ise, mevcut ve ne zaman bana sadece 128 boyutunu göndermek için SQL söylemek mümkün mü?

Bir başka soru birisi bana GROUP BY ile bir çözüm vermek ama biz isim GROUP BY var, çünkü bu durumda o koşmak yok. Ben GROUP BY silerseniz Ve, bana aynı simgelerin her boyutunu gösteriyor.

Teşekkürler!

3 Cevap

Alt sorgular kullanmayı deneyin.

SELECT * FROM (

    SELECT * FROM pl_icon
    WHERE tag LIKE '%$SEARCH_QUERY%'
    ORDER BY IF(size = 128, 0, 1)

) pl_icon
GROUP BY name
ORDER BY id DESC
LIMIT ...

Biz her şeyden başkalarının size = 128 ile iç sorgu ve yer satırlar tüm eşleşen satırları bulmak. Daha sonra, her isim için biz GROUP BY kullanarak sadece ilk kayıt seçin.

Fıkra bu sırayı deneyin (id veya boyutta?):

ORDER BY case when size=128 then 999999 else size end DESC

Gerçekten ne istiyorum o büyük boyuttaki kaydını almak ise:

SELECT name, tag, MAX(size)
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag

Ama burada ne karıştırıyor 'isim' benzersiz olmasıdır. Son sayaç okuma gibi, ya da en büyük fatura - Genellikle bu tür senaryolarda insanların maksimum (veya minimum) meydana kaydı tanımlamak istiyorum. Yani tablo bir id alanı vardı ve bunu almak istiyorsa:

SELECT pl2.*
FROM pl_icon pl2,
(SELECT name, tag, MAX(size) AS biggest
FROM pl_icon 
WHERE tag LIKE '%".$SEARCH_QUERY."%' 
GROUP BY name, tag) ilv
WHERE ilv.name=pl2.name
AND ilv.tag=pl2.tag
AND ilv.biggest=pl2.size;

Ancak bu çok büyük tablolar / seçer için oldukça verimsiz olabilir - MAX(CONCAT kandırmak denemek isteyebilirsiniz zaman

C.