2011-12-08 8 views
0

同じクエリ内の別のSELECTから情報を取得しようとしていますが、後に必要なフィールドを取得する方法がわかりません。MySQLクエリカウント出力

SELECT t.`id`, t.`title`, t.`author`, t.`content`, ctitle, cid, comments 

FROM `tutorials` AS `t`, 

    (
    SELECT tc.`id` as `cid`, tc.`title` as `ctitle` 
    FROM `tutorial_categories` AS `tc` 
    WHERE `title` LIKE '%category title' 
) AS `c`, 

    (
    SELECT COUNT(com.`id`) as `comments` 
    FROM `tutorial_comments` AS `com` 
    WHERE `tutorial_id` = c.cid 
) as `comments` 

WHERE t.`category` = c.`cid` AND t.`status` = '1' 
ORDER BY `id` ASC 

私はtutorial_categoriesからIDを取得し、tutorial_commentsでそれを使用しようとしています。最終的な出力として何をしようとしているのかは、チュートリアルごとにいくつのコメントがリストされているかを調べることです。

乾杯、

ヤコブ

答えて

2

あなたは、私がこの

select t.id, t.tilte, t.author, t.content, count(com.id) as comments 
from tutorials as t 
    join tutotials_categories as cat 
     on t.category = cat.id 
    join tutorials_comments as com 
     on com.tutorial_id = t.id 
where cat.title like'%category title' 
    and t.status = 1 
group by com.id 
order by t.id asc 

のようにgroup by句を追加する必要があるヤコブ

中古ANSIこれはあなたのクエリをクリーンアップする必要がありますフォーム

+0

今では、カテゴリごとのすべての結果ではなく、コメントを含む結果しか表示されません。 –

+0

申し訳ありませんが、私はあなたが意味するものをキャッチしていませんでした。ジョイントを左にしてコメントのないチュートリアルを表示し、カテゴリ別にソートして結果セットをソートすることができます。 btw、@erwinのスクリプトを試すことができると思います。 –

0

あなたはこの1つを試すことができます:

SELECT t.`id`, t.`title`, t.`author`, t.`content`, c.title, c.cid, ct.comments 
FROM `tutorials` AS `t` 

LEFT OUTER JOIN (
    SELECT tc.`id` as `cid`, tc.`title` as `ctitle` 
    FROM `tutorial_categories` AS `tc` 
    WHERE `title` LIKE '%category title' 
) AS `c` ON t.`category` = c.`cid` 

LEFT OUTER JOIN (
    SELECT COUNT(com.`id`) as `comments` 
    FROM `tutorial_comments` AS `com` 
    group by com.`id` 
) as `ct` on ct.`tutorial_id` = c.cid 

WHERE t.`status` = '1' 
ORDER BY `id` ASC 
1

に参加:

SELECT t.id, t.title, t.author, t.content, c.ctitle, c.cid, com.comments 
FROM tutorials AS t 
LEFT JOIN (
    SELECT tutorial_id, COUNT(com.id) as comments 
    FROM tutorial_comments AS com 
    GROUP BY 1 
    ) AS com ON com.tutorial_id = t.category 
LEFT JOIN (
    SELECT tc.id as cid, tc.title as ctitle 
    FROM tutorial_categories AS tc 
    WHERE title LIKE '%category title' 
    ) AS c ON t.category = c.cid 
WHERE t.status = '1' 
ORDER BY t.id 

LEFT JOINはチュートリアルが一致するものを見つけていないことを消えることを防ぐことができます。
JOIN条件付きの明示的なJOINを作成しました。これは理解しやすく、適切な方法です。
カジュアルな問題は、カウントされたコメントのジョイン条件が外ではなくカッコ内にあることでした。そのようには機能しません。