2011-01-02 14 views
1

私は複雑なMySQLのテーブルを選択/事前条件と結合

CREATE TABLE `vocabulary` (
`vid` int(10) unsigned NOT NULL auto_increment, 
`name` varchar(255), 
PRIMARY KEY vid (`vid`) 
); 

CREATE TABLE `term` (
`tid` int(10) unsigned NOT NULL auto_increment, 
`vid` int(10) unsigned NOT NULL default '0', 
`name` varchar(255), 
PRIMARY KEY tid (`tid`) 
); 

CREATE TABLE `article` (
`aid` int(10) unsigned NOT NULL auto_increment, 
`body` text, 
PRIMARY KEY aid (`aid`)  
); 

CREATE TABLE `article_index` (
`aid` int(10) unsigned NOT NULL default '0', 
`tid` int(10) unsigned NOT NULL default '0' 
) 

INSERT INTO `vocabulary` values (1, 'vocabulary 1'); 
INSERT INTO `vocabulary` values (2, 'vocabulary 2'); 

INSERT INTO `term` values (1, 1, 'term v1 t1'); 
INSERT INTO `term` values (2, 1, 'term v1 t2 '); 
INSERT INTO `term` values (3, 2, 'term v2 t3'); 
INSERT INTO `term` values (4, 2, 'term v2 t4'); 
INSERT INTO `term` values (5, 2, 'term v2 t5'); 

INSERT INTO `article` values (1, ""); 
INSERT INTO `article` values (2, ""); 
INSERT INTO `article` values (3, ""); 
INSERT INTO `article` values (4, ""); 
INSERT INTO `article` values (5, ""); 

INSERT INTO `article_index` values (1, 1); 
INSERT INTO `article_index` values (1, 3); 
INSERT INTO `article_index` values (2, 2); 
INSERT INTO `article_index` values (3, 1); 
INSERT INTO `article_index` values (3, 3); 
INSERT INTO `article_index` values (4, 3); 
INSERT INTO `article_index` values (5, 1); 
INSERT INTO `article_index` values (5, 4); 

例以下のスキーマを持っています。 Defiend Vocabularyの用語を選択します。 VID = 2

select a.tid, count(*) as article_count from term t JOIN article_index a 
ON t.tid = a.tid where t.vid = 2 group by t.tid; 
 
    +-----+---------------+ 
    | tid | article_count | 
    +-----+---------------+ 
    | 3 |    3 | 
    | 4 |    1 | 
    +-----+---------------+ 

質問:

  1. 選択用語
    。 (例:vid = 1 =>用語{1,2})
    のような、defiendボキャブラリーフィルタ(a)は、特定の用語の記事にリンクされた用語のみを必要とする。 TID = 3、結果=> {1}、TIDとの用語は、= 2は、TIDの条件にないリンケージので除外されるので= 3

SQL:article_countとして正しくないが間違っている

SELECT t.tid, count(*) as c FROM term t JOIN article_index i ON t.tid = i.tid WHERE t.vid = 1 AND i.aid IN 

    (SELECT i.aid FROM term t JOIN article_index i ON t.tid = i.tid WHERE i.tid = 3) 

GROUP BY t.tid ; 

結果:

 
+-----+---------------+ 
| tid | article_count | 
+-----+---------------+ 
| 1 |    2 | 
+-----+---------------+ 

期待される結果:一つだけの記事では、両方のTID = 3、TID = 1

とリンクしているので3210
+1

... count(distinct t.vid)count(*)を交換する必要があります。人々は一般的にあなたのためのコードを書くのが好きではありません。それはそのままで、これは仕事の説明であり、質問ではありません。 –

+0

ありがとう、私は上記の私の現在の不正なSQLを追加しました。 – Howard

答えて

1

その素晴らしいではありませんが、

SELECT tid, count(*) 
FROM 

(


SELECT distinct t.tid 
FROM term t 
JOIN article_index i 
ON t.tid = i.tid 
WHERE t.vid = 1 
AND i.aid IN 

    (SELECT i.aid 
     FROM term t 
      JOIN article_index i 
      ON t.tid = i.tid 
     WHERE i.tid = 3) 

) t 
GROUP BY tid 
+0

これは大丈夫です、ありがとうございます。私はまだ多くの解決策を待っています。 – Howard

0

に取得するのは簡単で、あなたはちょうどあなたがこれまで書いてきたコードを投稿してください

関連する問題