Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
jaroox
Člen
Avatar
jaroox:20.2.2019 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.2.2019 12:10
Avatar
Odpovídá na jaroox
Michal Haňáček:20.2.2019 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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.2.2019 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.2.2019 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.2.2019 12:37
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.2.2019 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.2.2019 13:54
Avatar
plelovsky
Člen
Avatar
Odpovídá na jaroox
plelovsky:22.2.2019 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.2.2019 17:08
Avatar
plelovsky
Člen
Avatar
plelovsky:22.2.2019 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
22.2.2019 17:35
Avatar
Odpovídá na plelovsky
Honza Prosecký:22.2.2019 20:46

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

 
Nahoru Odpovědět
22.2.2019 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.