Autor Zpráva
Radovan789
Profil *
Ahoj, mám dvě tabulky games a cat_connect... cat_connect má sloupce id_game a id_cat. Chci vypsat všechny hry kromě těch které mají přiřazené id_cat=4 a id_cat=5. Mám tento dotaz:

SELECT games.* FROM blabla_games as games LEFT JOIN blabla_cat_connect as cats ON cats.id_game=games.id WHERE cats.id_cat!=4 AND cats.id_cat!=5

Vše funguje skvěle až na takový detail, že když má hra více přiřazených kategorií (více řádku v tabulce cat_connect se stejným id_game) vypíše se mi více stejných her, potřeboval bych to omezit pouze na jednu.

Neví někdo jak by tohle šlo vyřešit? Už sem nad tím strávil dost času. Předem děkuji.
mimochodec
Profil
... GROUP BY games.id
Radovan789
Profil *
Děkuju:) já si myslel že to bude nějaká blbost:D
Tori
Profil
Radovan789:
Chci vypsat všechny hry kromě těch které mají přiřazené id_cat=4 a id_cat=5
Pak tam musí být INNER JOIN místo LEFT JOIN.
Radovan789
Profil *
Tori:
Díky za připomínku.

Ještě bych měl dotaz jak potom můžu počítat celkový počet výsledků přes COUNT, přece jenom to GROUP BY mě to trochu kazí.
Tori
Profil
Možná SELECT games.*, SUM(COUNT(cats.id)) AS celkem ... ? Což bude totéž jako když zavoláte funkci ekvivalentní mysql_num_rows (= pokud používáte stránkování, tak zjistí jen počet výsledků na aktuální stránce). Anebo celkový počet záznamů samostatným dotazem SELECT COUNT(*) FROM cats (pokud je sloupec id_game indexovaný, tak se dotaz provede velmi rychle).
Radovan789
Profil *
No když použiji (nebo cats.id_game misto games.id):

SELECT SUM(COUNT(games.id)) FROM ...

tak mě to vyhodí:
Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1111 Invalid use of group function
Tori
Profil
Radovan789:
Aha, tak potom z hlavy nevím, snad někdo lepší poradí. Zatím můžete použít ten druhý dotaz anebo $pdoStatement->rowCount() (podle toho, jestli máte stránkování nebo ne).
Radovan789
Profil *
Tori:
Stránkování používám proto chci použít COUNT s jedním dotazem (queryOne) abych nemusel načítat všechny výsledky z databáze a našel jsem řešení podle angického fóra, které vypadá takhle:

SELECT COUNT(*) as total FROM (SELECT COUNT(*) FROM blabla_games as games LEFT JOIN blabla_cat_connect as cats ON cats.id_game=games.id WHERE cats.id_cat!=4 AND cats.id_cat!=5) as row_count



respektive:
SELECT COUNT(*) as total FROM (SELECT COUNT(*) FROM blabla_games as games INNER JOIN blabla_cat_connect as cats ON cats.id_game=games.id WHERE cats.id_cat!=4 AND cats.id_cat!=5 GROUP BY games.id) as row_count
Kajman
Profil
Původní dotaz lze přepsat na verzi bez group by.
SELECT games.*
FROM   blabla_games AS games
       LEFT JOIN blabla_cat_connect AS cats
              ON cats.id_game = games.id
                 AND cats.id_cat IN ( 4, 5 )
WHERE  cats.id_game IS NULL

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