2009-09-01 3 views
1

誰もがmySQLの学習のために良い本を推薦できれば、それは素晴らしいだろう:)。MySQL Queryにはいくつかのタイプの結合がありますか?わからない

私は私がやろうとしていますどのような二つのテーブル、タグcodes_tags

CREATE TABLE `tags` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=190 DEFAULT CHARSET=utf8 


CREATE TABLE `codes_tags` (
`code_id` int(11) unsigned NOT NULL, 
`tag_id` int(11) unsigned NOT NULL, 
KEY `sourcecode_id` (`code_id`), 
KEY `tag_id` (`tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

を持っては「タグ」から名前を選択し、どのように多くのことTAG_IDの「codes_tags」でありますその数だけ注文してください。そのtag_idのcodes_tagsにレコードがない場合、 'count'は0またはNULL(好ましくは0)に等しくなければなりません。

これは、私がこれまでに来た最も近い:私が何だそれは30

を返すべきときしかし、それは唯一の4行を返して、私が望んでい何をやっているようだ

SELECT tags.name, COUNT(codes_tags.tag_id) AS count 
FROM tags 
LEFT JOIN codes_tags ON tags.id = codes_tags.tag_id 
GROUP BY tag_id 
ORDER BY count DESC 
LIMIT 0 , 30 

ここで間違っている?おかげさまで

答えて

0

COUNT(codes_tags.tag_id)をSELECTのCOUNT(*)に変更すると、そのNULLも含まれると思います。 (ヌルか0カウントが足りない場合は、クエリが正常に表示されます)。

EDIT:2番目の考えでは、LEFT JOINが欠けていました。つまり、codes_tagsテーブルに何も関係していなくても、すべてのタグが必要な場合です。それはあなたが欲しいものですか?

私はおそらく次のようにします:

SELECT tags.name, COUNT(*) AS count 
FROM tags 
INNER JOIN codes_tags ON tags.id = codes_tags.tag_id 
GROUP BY tags.id 
ORDER BY count(*) DESC 

それはタグもcodes_tagsに含まれていないリスト内の項目ないから推測することができます。あなたが明示的にもいることをやってみたかった場合は、:

SELECT tags.name, COUNT(*) AS count 
FROM tags 
INNER JOIN codes_tags ON tags.id = codes_tags.tag_id 
GROUP BY tags.id 
UNION 
SELECT tags.name, '0' 
from tags 
where tags.name not in 
    (SELECT tags.name 
    FROM tags 
    INNER JOIN codes_tags ON tags.id = codes_tags.tag_id) 
ORDER BY count(*) DESC 

を(私は現時点ではSQLボックスへのアクセス権を持っているので、塩の粒でクエリを取ることはありません。彼らは未検証です。)

+0

申し訳ありませんが、私はすでにそれを試みました。それが返すのはちょっと変わったものです。最初のレコードのカウントは185です。その後、正しいカウントが1のレコードが3つあります。しかし、それでも4行しか返しません。 –

+0

あなたの2番目のSQLクエリは、まさに私の後でした。あなたはそれが何をしているのか説明できますか? –

+0

最初のSELECTは、tagsタグとcodes_tagsテーブルの両方に存在するすべての名前の名前と数を取得します。 UNIONでは、さらに行を追加したいとしています(列の型と数は両方のクエリで同じでなければならないことに注意してください)。 2番目のSELECTは、最初のSELECTの項目のうち、名前と0(カウントを表す)を取得します。 WHERE句は、結果を最初のクエリに含まれていない名前に限定します。 –

0

変更私はいくつかのダミーデータとクエリでのMySQLでこれをテストしてみたLEFT OUTER JOIN

1

からLEFT JOINは私のために4つの以上の行を返すように見えます。

insert into tags (name) values ('java'), ('mysql'), ('php'), ('ruby'), ('.net'), ('python'); 
insert into codes_tags (code_id, tag_id) values (1,194), (2,194), (3,194), (1,191), (2,191), (3,191), (4,191), (5,191), (1,192), (1,195), (1,193); 

このデータに対してクエリを実行すると、6行が返されます。あなたは、次の外部キーを追加することができ、あなたは適切なデータの整合性を持っていることを確認するために、

select count(*) from tags; 
select * from tags limit 10;

また、それならばを参照してください。さらに、デバッグこれを支援するためには、次の2つのクエリの結果を投稿することができます成功?

alter table codes_tags add foreign key codes_tags_tag_id_key(tag_id) references tags(id);
関連する問題