2014-05-14 2 views
0

내가 EAV 테이블 keywords에와 documents 테이블에서 레코드를 찾을 수와 OR 문에 쿼리를 만들려고 노력하고 있어요에서 검색 할 수 있지만, 그것은 나에게 반복 결과 제공 :은 어떻게 EAV 테이블 플러스 다른 MySQL의

SELECT d.id, d.name, d.created, d.updated 
FROM documents d 
INNER JOIN permissions p ON (d.wfid = p.wfId AND d.docid = p.docId AND p.userid = 1) 
INNER JOIN keywords k0 ON (k0.document_id = d.id AND (k0.value IN('Pérez, Gabriel', 
    'DOC1') OR d.name IN ('Pérez, Gabriel', 'DOC1'))) 
ORDER BY d.id DESC; 

+------+------+---------------------+---------------------+ 
| id | name | created    | updated    | 
+------+------+---------------------+---------------------+ 
| 5267 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:39:10 | 
| 5267 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:39:10 | 
| 5267 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:39:10 | 
| 5266 | DOC1 | 2014-03-07 11:41:23 | 2014-03-06 01:35:16 | 
| 5266 | DOC1 | 2014-03-07 11:41:23 | 2014-03-06 01:35:16 | 
| 5266 | DOC1 | 2014-03-07 11:41:23 | 2014-03-06 01:35:16 | 
| 5265 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:37 | 
| 5265 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:37 | 
| 5265 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:37 | 
| 5264 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:25 | 
| 5264 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:25 | 
| 5264 | DOC1 | 2014-03-07 11:41:23 | 2014-02-25 12:38:25 | 
| 5263 | DOC1 | 2014-04-07 11:23:00 | 2014-03-20 09:54:30 | 
| 5263 | DOC1 | 2014-04-07 11:23:00 | 2014-03-20 09:54:30 | 
| 5263 | DOC1 | 2014-04-07 11:23:00 | 2014-03-20 09:54:30 | 
+------+------+---------------------+---------------------+ 
15 rows in set (0.00 sec) 
을 내가 SELECT DISTINCT

를 사용하는 경우

그때 나는 내가 원하는 것을 얻을.

내 질문은 :

1) 당사 최초의 복제 행입니까?

2) SELECT DISTINCT를 사용하는 것이 좋지 않습니까? 아니면 성능에 도움이됩니까?

3) 내 쿼리가 잘못 작성 되었습니까? 나는 (Google 검색 등) 일치가있는 경우, 문서 테이블과 키워드 표,

mysql> describe documents; 
+---------+-----------+------+-----+---------------------+-----------------------------+ 
| Field | Type  | Null | Key | Default    | Extra      | 
+---------+-----------+------+-----+---------------------+-----------------------------+ 
| id  | int(11) | NO | PRI | NULL    | auto_increment    | 
| name | char(100) | YES |  | NULL    |        | 
| wfid | char(50) | YES |  | NULL    |        | 
| docid | char(50) | YES |  | NULL    |        | 
| created | timestamp | NO |  | 0000-00-00 00:00:00 |        | 
| updated | timestamp | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+---------+-----------+------+-----+---------------------+-----------------------------+ 
6 rows in set (0.00 sec) 

mysql> describe keywords; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| document_id | int(11)  | NO | MUL | NULL |    | 
| keyword  | char(50)  | NO |  | NULL |    | 
| value  | varchar(250) | YES |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 
4 rows in set (0.00 sec) 
+0

쿼리가 잘못 작성된 것이 아니기 때문입니다. 데이터베이스 구조가 [bad-designed] (http://stackoverflow.com/questions/20782760/difference-between-two-table-structure/20783125#20783125) –

+0

@ AlmaDo이기 때문에 그것입니다. 나는 그것의 나쁜 것을 알고 있습니다. 함께 살려면 두 번째 버전을 만들 때까지이 코드를 유지해야합니다. ( – JorgeeFG

+0

엘 세뇨 르 페레즈는 누구이며 이름과 값 모두에 그의 이름이 나타나는 이유는 무엇입니까? –

답변

0

에서 키워드 테이블의 정확한 형태를 분별하기 어렵다 볼 수 모두에서 입력 한 값을 검색하셔야합니다 질문이므로이 대답이 잘못되었을 수 있습니다.

그러나 일반적으로 키워드 (이름/값 쌍) 테이블에 액세스하여 이와 같이 하나의 키워드 값만 검색 할 수 있습니다.

SELECT d.id, d.name, d.created, d.updated, 
     k0.value AS doc1_value, 
     k1.value AS doc2_value 
    FROM documents AS d 
    LEFT JOIN keywords AS k0 ON k0.document_id = d.id AND k0.name = 'DOC1' 
    LEFT JOIN keywords AS k1 ON k1.document_id = d.id AND k1.name = 'DOC2' 

각 문서의 이름이 DOC1 및 DOC2 인 키워드 속성 값을 검색합니다. LEFT JOIN을 사용하면 특정 문서에 키워드 값이 없을 수있는 경우를 처리 할 수 ​​있습니다.

특정 값이 포함 된 특성을 가진 문서를 찾고 계십니까? 이 경우 당신은이 작업을 수행해야 할 수 있습니다 다음 가입 오히려 LEFT보다는의 사용이 가입

SELECT d.id, d.name, d.created, d.updated, 
     k0.value AS doc1_value, 
     k1.value AS doc2_value 
    FROM documents AS d 
    JOIN keywords AS sk ON sk.document_id = d.id AND sk.value = 'Pérez, Gabriel' 
    LEFT JOIN keywords AS k0 ON k0.document_id = d.id AND k0.name = 'DOC1' 
    LEFT JOIN keywords AS k1 ON k1.document_id = d.id AND k1.name = 'DOC2' 

공지 사항, 일치하지 않는 행을 제외 할 수 있습니다.

+0

Thanks Ollie, 매우 명확하지 않은 것에 대해 사과드립니다. 내 질문을 테이블로 업데이트했습니다. description. 나는'keywords.name','keywords.value','document.name' 만 검색하지 않을 것입니다. 그래서 DOC1을 검색하면 확실히'document.name'에있을 것입니다. 그러나 나는 알 수 없으므로 그건, 내가'keywords.value'와'document.name' 둘 다 살펴야 만합니다. 각 단어를 간단한 검색에 입력하고 일치하는 문서 ID를 검색합니다. – JorgeeFG