Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: Řazení podle pořadí where or

Ostatní jazyky SQL SQL a databáze Řazení podle pořadí where or

Aktivity (1)
Avatar
jaroox
Člen
Avatar
jaroox:20. února 12:10

Ahoj. Dávám dohromady SQL dotaz, který by měl vyhledávat ve všech sloupcích tabulky jedno klíčové slovo. Potřebuji ale, aby každý sloupec měl jinou "váhu". Například aby záznamy, které obsahují klíčové slovo v nadpise, byly vypsány nejdřív.

Kód zatím vypadá takto:

SELECT * FROM table
WHERE title LIKE "%text%" OR description LIKE "%text%" OR contact LIKE "%text%"

A já potřebuji, aby záznamy z toho prvního WHERE byly vypsány jako první atd... Je to vůbec možné takto přes SQL to udělat?

Chci docílit: Snažím se udělat jednoduchý vyhledávač.

 
Odpovědět 20. února 12:10
Avatar
Odpovídá na jaroox
Michal Haňáček:20. února 12:20

To co popisujes tak jak to popisujes samozrejme nejde. Takhle vyhledas ty zaznamy, ktere vyhovi podmince bez ohledu na nejakou prioritu. Reseni by mohlo byt vyhledavat vsude (upravena varianta toho co mas hodove) jen by sis musel vracet identifikator toho kde jsi to nasel ... tedy neco na zpusob:

SELECT FIRST 1 ID, PRIORITA
FROM
(
        SELECT ID, 1 AS PRIORITA FROM table
        WHERE title LIKE "%text%"
        UNION ALL
        SELECT ID, 2 AS PRIORITA FROM table
        WHERE description LIKE "%text%"
        UNION ALL
        SELECT ID, 3 AS PRIORITA FROM table
        WHERE contact LIKE "%text%"
)
ORDER BY PRIORITA

Tim by jsi nasel prvni zaznam podle priority ze vsech jednotlivych hledani. Vymyslet pujdou ale i jine, optimalizovanejsi reseni, tohle me napadlo na "prvni dobrou".

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 20. února 12:20
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
jaroox
Člen
Avatar
Odpovídá na Michal Haňáček
jaroox:20. února 12:37

Super, díky moc! Funguje dle očekávání.

Můj výsledný kód vypadá tedy takto:

SELECT *
FROM
(
        SELECT *, 1 AS PRIORITA FROM table
        WHERE title LIKE "%text%"
        UNION ALL
        SELECT *, 2 AS PRIORITA FROM table
        WHERE description LIKE "%text%"
        UNION ALL
        SELECT *, 3 AS PRIORITA FROM table
        WHERE contact LIKE "%text%"
) AS x
ORDER BY PRIORITA
 
Nahoru Odpovědět 20. února 12:37
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20. února 13:54
-- ja bych tam dal
SELECT *, `title` AS `match`, 1 AS `priorita`
-- a nakonec dal
ORDER BY  `priorita` ASC, `match` ASC

Jakoze to ma radit podle nalezeneho slova.

 
Nahoru Odpovědět 20. února 13:54
Avatar
plelovsky
Člen
Avatar
Odpovídá na jaroox
plelovsky:22. února 17:08

Pokud v některém záznamu bude hledaný text ve více sloupcích, pak budeš mít ve výsledcích tento záznam několikrát.

 
Nahoru Odpovědět 22. února 17:08
Avatar
plelovsky
Člen
Avatar
plelovsky:22. února 17:35
SELECT * FROM (
    SELECT
        *
        , CASE
            WHEN title LIKE "%text%" THEN 1
            WHEN description LIKE "text%" THEN 2
            WHEN contact LIKE "%text%" THEN 3
            ELSE 0
          END AS priority
    FROM table
) AS t
WHERE priority <> 0
ORDER BY priority
 
Nahoru Odpovědět  +1 22. února 17:35
Avatar
Odpovídá na plelovsky
Honza Prosecký:22. února 20:46

Ten Case muzes nacpat i primo do orderby, takze nemusis mit subquery

 
Nahoru Odpovědět 22. února 20:46
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.