Autor Zpráva
Enko
Profil *
Ahoj,
nějak se mi nedaří zprovoznit fulltextové vyhledávání z více tabulek. Každá tabulka má sloupec o názvu "polozka" a "popis".
Zde je můj dotaz:
CT * 
FROM smallwares, warehouse, eshop
WHERE MATCH (
polozka, popis
)
AGAINST (
'test*'
IN BOOLEAN
MODE 
)
ORDER BY 5 * 
MATCH (
polozka
)
AGAINST (
'test*'
) +1 * 
MATCH (
popis
)
AGAINST (
'test*'
) DESC 
LIMIT 0 , 30
a MySQL mi zahlásí chybu: "#1052 - Column 'polozka' in where clause is ambiguous"

Nevíte někdo proč?


v prvním řádku má být "SELECT *"
Kajman
Profil
Vyhledávejte ve třech tabulkách zvášť. Výsledky spojte přes union.
Enko
Profil *
Děkuji za nasměrování. Nicméně, když to udělám takto:
        SELECT polozka, popis
        FROM smallwares
        WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
        UNION

        SELECT polozka, popis
        FROM eshop
        WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
        UNION

        SELECT polozka, popis
        FROM warehouse
        WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
        ORDER BY 5 * MATCH(polozka) AGAINST ('$search*')
        + 1 * MATCH(popis) AGAINST ('$search*')
        DESC

Tak mi to hlásí: #1191 - Can't find FULLTEXT index matching the column list
Ale přitom fulltext indexy na těch sloupcích jsem dělal
Kajman
Profil
Po unionu už nebudou ty indexy použitelné, zkuste to uzávorkovat...

(
  SELECT polozka, 
         popis, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM smallwares
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
UNION ALL
(
  SELECT polozka, 
         popis, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM eshop
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
UNION ALL
(
  SELECT polozka, 
         popis, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM warehouse
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
ORDER BY myrank DESC
LIMIT 30

Pak by to mohlo fungovat, pokud budou na všech třech tabulkách samostatné fulltextové indexy na obou sloupcích.
Enko
Profil *
Luxus, funguje mi to přesně jak jsem chtěl. Děkuju za pomoc. Velmi si vážím Vaší pomoci.
Enko
Profil *
Tak ještě prosím o jednu radu. Když chci do vyhledávaného výsledku v tomto zahrnout ještě několik dalších sloupců nebo všechny, například tipu "int", atd... Jak upravit tento dotaz aby byl funkční?

(
  SELECT *, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM smallwares
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
UNION ALL
(
  SELECT *, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM eshop
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
UNION ALL
(
  SELECT *, 
         (5*MATCH(polozka) AGAINST ('$search') + MATCH(popis) AGAINST ('$search')) myrank
  FROM warehouse
  WHERE MATCH(polozka, popis) AGAINST ('$search*' IN BOOLEAN MODE)
  ORDER BY myrank DESC
  LIMIT 30
) 
ORDER BY myrank DESC
LIMIT 30
Toto mi hlásí:
#1222 - The used SELECT statements have a different number of columns

Zkoušel jsem několik dalších variant, ale nedaří se mi upravit tento dotaz, fungoval správně. Můžu Vás ještě jednou poprosit o pomoc?
Alphard
Profil
Vždyť je ta hláška jasná, máte různý počet sloupců. Vyjmenujte je a případně doplňte defaultními hodnotami.
Enko
Profil *
Jojo, už to mám. Jen jsem se předtím překlepl a proto to nejelo. Díky :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0