2011-01-02 3 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 어휘의 용어를 선택하십시오 (예 : 0이 아닌 기사 색인 포함). 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. 선택 용어
    을 수행합니다. defiend 어휘 (예 : vid = 1 => 용어 {1,2})가 아닌 기사 색인이있는
    b. 필터 (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

,137 연계 때문에 그냥 count(distinct t.vid)count(*)를 교체해야
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 
+1

지금까지 작성한 코드를 게시하시기 바랍니다 ... 얻을 수 있습니다. 사람들은 일반적으로 코드를 작성하는 것을 좋아하지 않습니다. 그대로, 이것은 일의 묘사이지 질문이 아닙니다. –

+0

감사합니다. 위의 잘못된 현재 SQL을 추가했습니다. – Howard

답변

1

가장 큰하지만 쉽지는

+0

괜찮습니다. 고마워요. 나는 아직도 더 많은 해결책을 기다리고있다. – Howard

관련 문제