1

p としてテーブル ポスト、pt としてテーブル タグ、ptr としてテーブル タグリファレンスがあります。

tagsref には、投稿の ID とタグ テーブルが含まれます。

私は group_concat を使用し、group by 句を使用しませんでした。これは、条件で if 条件を使用して 1 つの行 (p.slug = 'once') のみをフィルター処理しているため、条件を追加したため、1 つの行のみが返されると想定しているためです。はい、そうでした。

問題は、まだ行がない場合に、null 値を持つ行を取得したことです。次のSQLでは、スラッグが「なし」の行がないため、最後の条件は結果をフェッチしません。結果はまったく得られませんが、NULL値を持つ行が1つ得られました。

SELECT p.name, p.slug, GROUP_CONCAT(pt.name) as catz 
FROM post_tags pt, post_tagsref ptr, post p  
WHERE p.id = ptr.tid AND ptr.cid = pt.id  AND p.slug = 'none'

group by 句を使用することを提案し、group_by 集計関数は group by 句が指定されていなくても機能するが、結果は予測できない可能性があると述べました。

私はgroup byを使用し、働いています。まだ。

post
-----
id  |   name    |   slug
1   |   sam     |   sam
2   |   do do   |   do-do

post_tags
--------------
id  |   name    |   slug
1   |   music   |   music
2   |   movies  |   movies
3   |   tv      |   tv

post_tagsref
------------    
pid |   pcid
1   |   2
1   |   1
2   |   1

上記がテーブル構造です。

行がまったくない場合、group_concat が 1 つの行を null 値で返すのはなぜですか?

このような質問の理由は、何が何であるかを確認するためです... :)

参照:

ID が見つからない場合、クエリは null 値を持つ 1 行になります

4

1 に答える 1

0

それにもかかわらず、入力のない集計関数は出力を生成する傾向があります。行がない場合の合計はゼロであり、カウントもゼロであり、平均はNULLです。この種のことにより、多くのクエリが一貫したものになり、NULL.

条件でif条件を使用して1行のみをフィルタリングしているため、group by句は使用しませんでした[…]

1 つの投稿のみにフィルターをかけますが、投稿ごとに複数のタグが存在する可能性があると想定しているため (そうでなければ、なぜ を使用するのでしょうかgroup_concat)、結合によって複数の行が生成されます。したがって、おそらく投稿 ID でグループ化する必要があります。

また、現在内部結合を行っているため、タグがまったくない投稿は報告されないため、そこで左結合を使用することを検討してください。

于 2012-12-07T13:24:12.420 に答える