2014-02-26 2 views
3

어떻게 값으로 정렬 할 수 있습니까? 나는 값의 순서대로 문서 ID를 가져야한다. 결과 쿼리의EAV 테이블에서 값순으로 MySQL을 정렬 하시겠습니까?

예 :

+------+------+------------+-------+---------------------+---------------------+ 
| id | name | wfid  | docid | created    | updated    | 
+------+------+------------+-------+---------------------+---------------------+ 
| 5269 | DOC2 | documentos | doc | 2014-02-25 09:34:56 | 2014-02-25 09:39:51 | 
| 5270 | DOC2 | documentos | doc | 2014-02-25 09:34:57 | 2014-02-25 10:41:57 | 
| 5271 | DOC2 | documentos | doc | 2014-02-25 09:34:57 | 2014-02-25 10:42:20 | 
+------+------+------------+-------+---------------------+---------------------+ 

나는 그것을 달성하는 방법을 모르겠어요. 그것은 매우 못생긴 쿼리와 함께 작동하지만 주문할 능력이 없습니다. 예를 들어, Client1의 모든 문서를 갖고 싶습니다. Period으로 주문하십시오. 사용자는 문서를 볼 수있는 권한이 있어야하며 허락은 wfid, dociduserid으로 구성됩니다.

가능합니까?

바이올린 : http://sqlfiddle.com/#!2/3b49e8

스키마 :

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 users; 
+----------+----------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+----------+----------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| login | char(30) | NO |  | NULL |    | 
| password | char(50) | NO |  | NULL |    | 
+----------+----------+------+-----+---------+----------------+ 
3 rows in set (0.00 sec) 

mysql> describe permissions; 
+--------+----------+------+-----+---------+----------------+ 
| Field | Type  | Null | Key | Default | Extra   | 
+--------+----------+------+-----+---------+----------------+ 
| id  | int(11) | NO | PRI | NULL | auto_increment | 
| wfId | char(50) | NO |  | NULL |    | 
| docId | char(50) | NO |  | NULL |    | 
| userId | int(11) | NO | MUL | NULL |    | 
+--------+----------+------+-----+---------+----------------+ 
4 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.01 sec) 

데이터 :

mysql> select * from permissions; 
+----+------------+-------+--------+ 
| id | wfId  | docId | userId | 
+----+------------+-------+--------+ 
| 13 | documentos | doc |  7 | 
+----+------------+-------+--------+ 
1 row in set (0.00 sec) 

mysql> select * from users; 
+----+-------+----------+ 
| id | login | password | 
+----+-------+----------+ 
| 7 | admin | a  | 
+----+-------+----------+ 
1 row in set (0.00 sec) 

mysql> select * from documents; 
+------+------+------------+-------+---------------------+---------------------+ 
| id | name | wfid  | docid | created    | updated    | 
+------+------+------------+-------+---------------------+---------------------+ 
| 5263 | DOC1 | documentos | doc | 2014-02-25 09:34:44 | 2014-02-25 09:38:09 | 
| 5264 | DOC1 | documentos | doc | 2014-02-25 09:34:50 | 2014-02-25 09:38:25 | 
| 5265 | DOC1 | documentos | doc | 2014-02-25 09:34:50 | 2014-02-25 09:38:37 | 
| 5266 | DOC1 | documentos | doc | 2014-02-25 09:34:50 | 2014-02-25 09:38:59 | 
| 5267 | DOC1 | documentos | doc | 2014-02-25 09:34:51 | 2014-02-25 09:39:10 | 
| 5268 | DOC2 | documentos | doc | 2014-02-25 09:34:56 | 2014-02-25 09:39:25 | 
| 5269 | DOC2 | documentos | doc | 2014-02-25 09:34:56 | 2014-02-25 09:39:51 | 
| 5270 | DOC2 | documentos | doc | 2014-02-25 09:34:57 | 2014-02-25 10:41:57 | 
| 5271 | DOC2 | documentos | doc | 2014-02-25 09:34:57 | 2014-02-25 10:42:20 | 
| 5272 | DOC2 | documentos | doc | 2014-02-25 09:34:58 | 2014-02-25 10:43:04 | 
+------+------+------------+-------+---------------------+---------------------+ 
10 rows in set (0.00 sec) 

mysql> select * from keywords; 
+-------+-------------+-----------+----------+ 
| id | document_id | keyword | value | 
+-------+-------------+-----------+----------+ 
| 15888 |  5263 | Nombre | Cliente1 | 
| 15889 |  5264 | Nombre | Cliente1 | 
| 15890 |  5265 | Nombre | Cliente1 | 
| 15891 |  5266 | Nombre | Cliente2 | 
| 15892 |  5267 | Nombre | Cliente3 | 
| 15893 |  5268 | Nombre | Cliente3 | 
| 15894 |  5269 | Nombre | Cliente3 | 
| 15895 |  5270 | Nombre | Cliente4 | 
| 15896 |  5271 | Nombre | Cliente4 | 
| 15897 |  5272 | Nombre | Cliente4 | 
| 15898 |  5263 | Periodo | 201301 | 
| 15899 |  5263 | OtroValor | 1  | 
| 15900 |  5264 | Periodo | 201301 | 
| 15901 |  5264 | OtroValor | 1  | 
| 15902 |  5265 | Periodo | 201301 | 
| 15903 |  5265 | OtroValor | 1  | 
| 15904 |  5266 | Periodo | 201302 | 
| 15905 |  5266 | OtroValor | 2  | 
| 15906 |  5267 | Periodo | 201302 | 
| 15907 |  5267 | OtroValor | 2  | 
| 15908 |  5268 | Periodo | 201302 | 
| 15909 |  5268 | OtroValor | 2  | 
| 15910 |  5269 | Periodo | 201303 | 
| 15911 |  5269 | OtroValor | 3  | 
| 15912 |  5270 | Periodo | 201303 | 
| 15913 |  5270 | OtroValor | 3  | 
| 15914 |  5271 | Periodo | 201304 | 
| 15915 |  5271 | OtroValor | 3  | 
| 15916 |  5272 | Periodo | 201304 | 
+-------+-------------+-----------+----------+ 
29 rows in set (0.00 sec) 
+0

원하는 DDL (및/또는 sqlfiddle)과 함께 원하는 결과 세트 – Strawberry

+0

http : // sqlfiddle .com/#! 2/3b49e8 – JorgeeFG

+0

다음과 같이 시작하면 도움이됩니까? http://sqlfiddle.com/#!2/3b49e8/1 ...? – Strawberry

답변

1

내가 지금 거기에 우리가 간다, 내가 속임수를 썼는지 생각 :

먼저 INNER 수행해야합니다 조인 docspermissions 조건에 테이블 요 u (동일한 docid 및 동일한 wfid)를 사용하여 권한이있는 행만 docs에서 가져옵니다. 그런 다음 사용자별로 필터링하여 원하는 사용자 만 얻습니다. 마지막에 조건을 넣지 만 나중에 테이블에 조인 할 경우 성능을 향상시키기 위해 원하는 경우 ON 조건을 포함 할 수 있습니다. 그 후에 원하는 순서 조건을 지정합니다.

내가 함께 끝났다 SQL은 다음과 같습니다

SELECT d.id, d.name, d.wfid, d.docid, d.created, d.updated 
FROM documents d 
INNER JOIN permissions p 
ON (d.wfid = p.wfId 
    AND d.docid = p.docId) 
WHERE p.userid = 7 
ORDER BY d.created DESC 

http://sqlfiddle.com/#!2/3b49e8/14/0

성능을 향상하기 위해 created, wfid에 대한 인덱스와 docs에서 docid 필드를 포함하는 경우 당신이 그들을 사용할 때 그것은 좋은 일 수 내부 조인과 주문을위한 열쇠로서.

UPDATE

확인이 : http://sqlfiddle.com/#!2/3b49e8/19/0

내가 두 번 쿼리에 다른 테이블 만들기를 추가 한 이상 가입 키워드 :

SELECT d.id, d.name, d.wfid, d.docid, d.created, d.updated, k1.keyword 
FROM documents d 
INNER JOIN permissions p 
ON (d.wfid = p.wfId 
    AND d.docid = p.docId) 
INNER JOIN keywords k1 
ON (k1.document_id = d.id 
    AND k1.keyword = 'Periodo') 

INNER JOIN keywords k2 
ON (k2.document_id = d.id 
    AND k2.keyword = 'Nombre') 

WHERE p.userid = 7 
AND k2.value = 'Cliente1' 

ORDER BY d.created DESC 

당신이 볼 수 있듯이, 나는 추가 키워드가 합쳐져 ​​"Periodo"가 표시됩니다.

+0

답변을 주셔서 감사합니다. 필요한 것은'keywords' 테이블의 값으로 주문하는 것입니다. 당신은 주문을 위해'documents' 테이블을 사용하고 있습니다. – JorgeeFG

+0

아, 나는 질문에서 그것을 읽지 않았다. 키워드에 대해 말하지 않고 다른 표와 어떻게 관련되어 있는지에 대해 말하지 않기 때문에 업데이트하십시오. 해당 테이블을 정렬하려면 위에서 작성한 쿼리에 참여해야합니다. – Chococroc

+0

좋아, 나는 그것이 네가 원하는 것을 지금 생각한다; D – Chococroc

관련 문제