1

データベース テーブル .

上記のように4つのテーブルがあります。現在、記事の件名、各記事のタグ、各記事のコメント数を含むすべてのデータを 1 つのクエリで取得しようとしています

私が今使っているSQLクエリは

SELECT
    articles.subject, GROUP_CONCAT(tags.name) AS tags, COUNT(comments.aid) AS comments
FROM articles
    LEFT JOIN comments ON comments.aid = articles.aid
    LEFT JOIN relations ON relations.aid = articles.aid
    LEFT JOIN tags ON tags.tid = relations.tid
GROUP BY
    articles.aid

結果: [ ] 内のデータが実際に得られるものです

array
(
    1 => array
    (
        subject => foo
        tags =>
        comments => 1
    )
    2 => array
    (
        subject => bar
        tags => html,mysql [html,mysql,html,mysql]
        comments => 2 [4]
    )
    3 => array
    (
        subject => baz
        tags => php
        comments => 0
    )
)

ここでのアプリケーションの実際の状況では、タグの数とコメントの数は互いに乗算されます。例: 1 つの記事に 4 つのコメントと 3 つのタグがある場合、クエリは次のようになります。

タグ: html,css,php, html,css,php, html,css,php, html,css,php (html,css,php の代わりに)

コメント: 12 (代わりに 4)

クエリステートメントに何か問題があるに違いないことはわかっていますが、それを修正する方法がわかりません。誰か助けてください。ありがとう。

4

2 に答える 2

1

コメントをカウントするには、ネストされたクエリが必要だと思います

SELECT
    articles.subject, GROUP_CONCAT(tags.tag) AS tags, comments
FROM articles
    LEFT JOIN (
          select aid,count(cid) as comments from comments group by aid
    ) AS commentscount ON commentscount.aid = articles.aid
    LEFT JOIN relations ON relations.aid = articles.aid
    LEFT JOIN tags ON tags.tid = relations.tid
GROUP BY
    articles.aid
于 2012-09-18T17:03:51.927 に答える
1

共通の列でテーブルを結合すると、それらの列を共有する行のすべての組み合わせが得られます。

この場合、 の場合、aid 2記事から 1 行、コメントから 2 行、関係から 2 行があります。COUNT()1*2*2 = 4、これは関数の結果として表示されているものです。

このクエリを実行する場合:

SELECT * FROM articles
LEFT JOIN comments ON comments.aid = articles.aid
LEFT JOIN relations ON relations.aid = articles.aid
LEFT JOIN tags ON tags.tid = relations.tid
WHERE articles.aid = 2

COUNTカウントされている 4 つの生成された行を確認できます。

aid | subject | cid | comment  | tid | name
----+---------+-----+----------+-----+------
2   | bar     | 1   | comment1 | 1   | html
2   | bar     | 1   | comment1 | 3   | mysql
2   | bar     | 2   | comment2 | 1   | html
2   | bar     | 2   | comment2 | 3   | mysql

コメントの数をカウントしたいだけの場合はCOUNT(comments.aid)、クエリの をCOUNT(DISTINCT comments.cid)-- に変更すると、カウント時に重複が除外されます。

于 2012-09-18T17:01:56.977 に答える