Autor Zpráva
llook
Profil
Řeším SQL dotaz pro hledání příspěvků diskuze. Mám MySQL 4.1 a strukturu podobnou následujícímu (zjednodušeně):
CREATE TABLE `posts` (

`post_id` INT PRIMARY KEY,
`post_text` TEXT,
`post_time` DATETIME,
`topic_id` INT REFERENCES `topics`
);
CREATE TABLE `topics` (
`topic_id` INT PRIMARY KEY,
`topic_title` VARCHAR(255)
);

Chci vybrat všechny příspěvky, které obsahují určité klíčové slovo v textu (post_text), snadná věc:
SELECT * FROM `posts`

JOIN `topics` USING (`topic_id`)
WHERE `post_text` LIKE '%slovo%';

Zároveň bych ale rád vybral i první příspěvek každého tématu, které to obsahuje v titulku (topic_title) a už jsem v koncích. Prostě potřebuju nějak rozpoznat, že příspěvek je v rámci svého tématu první, pak by šlo udělat OR `prvni` AND `topic_title` LIKE '%slovo%'.

Nějaký nápad?
llook
Profil
Teď jsem vymyslel takovouhle šílenost:
* FROM posts AS p

JOIN topics AS t USING (topic_id)

JOIN
(SELECT post_id, topic_id FROM
(SELECT p.post_id, p.topic_id
FROM posts AS p
JOIN topics USING (topic_id)
ORDER BY p.post_time ASC
) AS p
GROUP BY p.topic_id
) AS prvni
ON prvni.topic_id=p.topic_id


WHERE
p.post_text LIKE '%slovo%'
OR (prvni.post_id=p.post_id AND t.topic_title LIKE '%slovo%')

To teda jako funguje, ale moc odvázanej z toho zrovna nejsem. Přece to musí jít jednodušeji!
llook
Profil
Vzpoměl jsem si, že je to v něčem dost podobné jinému problému a tak mě napadlo jednodušší řešení, pouze s jedním subquery:
JOIN

(SELECT p1.post_id, p1.topic_id FROM posts AS p1
LEFT JOIN posts AS p2
ON p1.topic_id=p2.topic_id AND p1.post_time>p2.post_time
WHERE p2.post_time IS NULL
) AS prvni
ON prvni.topic_id=p.topic_id

Jednoduššeji to už asi nepůjde.
Kajman_
Profil *
Možná bych spíše použil vnořené dotazy takto...
... or p.post_id in (select min(post_id) from posts where topic_id in (select topic_id from topics where topic_title LIKE '%slovo%') group by topic_id)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0