Autor Zpráva
mackopu
Profil
Mám tabulku otázek, odpovědí a uživatelů:
CREATE TABLE IF NOT EXISTS `otazky` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_uzivatele` int(11) NOT NULL,
  `nazev` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `otazky` (`id`, `id_uzivatele`, `nazev`) VALUES
(1, 1, 'Otázka 1'),
(2, 2, 'Otázka 2'),
(3, 1, 'Otázka 3'),
(4, 2, 'Otázka 4'),
(5, 1, 'Otázka 5'),
(6, 2, 'Otázka 6');

CREATE TABLE IF NOT EXISTS `odpovedi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_otazky` int(11) NOT NULL,
  `text` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
);
INSERT INTO `odpovedi` (`id`, `id_otazky`, `text`) VALUES
(1, 1, 'Odpověď 1'),
(2, 1, 'Odpověď 2'),
(3, 1, 'Odpověď 3'),
(4, 1, 'Odpověď 4'),
(5, 1, 'Odpověď 5'),
(6, 2, 'Odpověď 6'),
(7, 2, 'Odpověď 6'),
(8, 3, 'Odpověď 6'),
(9, 3, 'Odpověď 6'),
(10, 3, 'Odpověď 6'),
(11, 4, 'Odpověď 6'),
(12, 4, 'Odpověď 6');

CREATE TABLE IF NOT EXISTS `uzivatele` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `jmeno` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `uzivatele` (`id`, `jmeno`) VALUES
(1, 'Uživatel 1'),
(2, 'Uživatel 2');
A nyní potřebuji vypsat všechny otázky, které obsahují alespoň 3 odpovědi.
Toto nefunguje:
SELECT otazky.id AS idecko_otazky, 
otazky.id_uzivatele AS idecko_uzivatele, 
otazky.nazev AS nazev_otazky 
FROM otazky, odpovedi, uzivatele 
WHERE otazky.id_uzivatele = uzivatele.id 
AND ( 
      (SELECT COUNT(odpovedi.id) 
      FROM odpovedi, otazky 
      WHERE odpovedi.id_otazky = otazky.id) 
      >= 3 
    ) 
AND otazky.id_uzivatele = uzivatele.id 
AND otazky.id = odpovedi.id_otazky; 
V čem je chyba?
Tori
Profil
V čem je chyba?
V poddotazu znovu připojujete tabulku otazky, ale bez vazby na vnější dotaz. Takže jestli tomu správně rozumím, pokud existuje nějaká (kterákoli) otázka s více než třemi odpověďmi, podmínka se vyhodnotí jako TRUE pro každý řádek z vnějšího dotazu. Pokud poddotaz upravíte na
(SELECT COUNT(odpovedi.id) 
      FROM odpovedi
      WHERE odpovedi.id_otazky = otazky.id) 
      >= 3 
    )
, bude to vracet správná ID otázek (= tabulka otazky se teď vztahuje k vnějšímu dotazu), ale budou se ve výsledku opakovat tolikrát, kolik mají odpovědí. Použila bych spíš tohle:
SELECT q.id idecko_otazky, q.id_uzivatele idecko_uzivatele, 
u.jmeno jmeno_tazatele, q.nazev nazev_otazky, COUNT( a.id ) cnt
FROM otazky q
INNER JOIN odpovedi a ON a.id_otazky = q.id
INNER JOIN uzivatele u ON q.id_uzivatele = u.id
GROUP BY q.id
HAVING cnt > 2
mackopu
Profil
To je přesně ono, děkuji mnohokrát.

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: