Autor Zpráva
djlj
Profil
Zdravím,

mám „problém“ s GROUP BY a nevím, jak na něj.

Používám například následující konstrukci:

SELECT title, text
FROM clanky
WHERE MATCH (title) AGAINST ('".$hledat."' IN BOOLEAN MODE) OR MATCH (text) AGAINST ('".$hledat."' IN BOOLEAN MODE)
GROUP BY sekce_id
ORDER BY 3 * MATCH (title) AGAINST ('".$hledat."') + MATCH (text) AGAINST ('".$hledat."') DESC

a chci vypsat z každé sekce JEN jeden výsledek. To tedy řeším GROUPnutím na sekce_id, nicméně to přináší problém, že se nevybere nejrelativnější výsledek, ale jen ten, který byl s hledaným obsahem vložen do databáze jako první. Jak to tedy jednoduše obejít tak, abych zobrazil z každé sekce jen jeden výsledek, a to ten nejrelevantnější?
Kajman_
Profil *
Co to negroupovat, ale seřadit podle sekce, matche a v aplikaci vypsat z kazde sekce jen prvni?
djlj
Profil
Dík za odpověď.

Jenže při stovkách výsledků je celkem zbytečně vybírat z databáze položky, které nebudu potřebovat… Jinak to opravdu vyřešit nejde? :(
Kajman_
Profil *
Obecné ukázky jsou tu...
http://dev.mysql.com/doc/refman/4.1/en/example-maximum-column-group-ro w.html
...ale v kombinaci s match to asi nebude nejrychlejší.
djlj
Profil
Zkouším to nějak sesmolit podle toho, ale funguje to (fulltext) prapodivně. Každopádně díky za odpovědi ;).
djlj
Profil
Tak jsem to nakonec vyřešil. Kdyby to někdo někdy potřebovat a hledal, tak:

SELECT title, text
FROM clanky
WHERE (MATCH (title) AGAINST ('".$hledat."' IN BOOLEAN MODE) OR MATCH (text) AGAINST ('".$hledat."' IN BOOLEAN MODE)) AND id = (SELECT id FROM clanky c WHERE c.sekce_id = clanky.id AND (MATCH (title) AGAINST ('".$hledat."' IN BOOLEAN MODE) OR MATCH (text) AGAINST ('".$hledat."' IN BOOLEAN MODE)) ORDER BY 3 * MATCH (title) AGAINST ('".$hledat."') + MATCH (text) AGAINST ('".$hledat."') DESC LIMIT 1)
GROUP BY sekce_id
Toto téma je uzamčeno. Odpověď nelze zaslat.