【发布时间】:2014-01-17 12:25:01
【问题描述】:
在我的 MYSQL 数据库中,我有多个这样的表:
reference:
------------------------------
| id | title | subtitle |
| 1 | Test | Just a test |
| 2 | Another | Second |
| 3 | Last | Third |
------------------------------
author:
-----------------------------
| id | firstname | lastname |
| 1 | Peter | Pan |
| 2 | Foo | Bar |
| 3 | Mr. | Handsome |
| 4 | Steve | Jobs |
-----------------------------
keyword:
----------------
| id | keyword |
| 1 | boring |
| 1 | lame |
----------------
reference_author_mm:
---------------------------
| uid_local | uid_foreign |
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 2 |
| 2 | 4 |
| 3 | 1 |
| 3 | 2 |
| 3 | 4 |
---------------------------
所有表都有一个n:m 与references 表的关系表。通过一个查询,我想SELECT所有参考文献并按作者姓名或关键字等过滤/排序它们。所以我想要的输出是这样的:
用户按title搜索:
------------------------------------------------------------------------------
| id | title | subtitle | authors | keywords |
| 1 | Test | Just a test | Peter Pan, Foo Bar | boring |
| 2 | Another | Second | Peter Pan, Foo Bar, Steve Jobs | boring, lame |
| 3 | Last | Third | Peter Pan, Foo Bar, Steve Jobs | boring, lame |
-------------------------------------------------------------------------------
此时我有一个很长的构造,它不太工作:
SELECT r.* , Authors.author AS authors, Keywords.keyword AS keywords
FROM references AS r
LEFT OUTER JOIN (
SELECT r.pid AS pid,
GROUP_CONCAT(CONCAT_WS(\' \', CONCAT(p.lastname, \',\'), p.prefix, p.firstname) SEPARATOR \'; \') AS author
FROM reference AS r
LEFT JOIN reference_author_mm r2p ON r2p.uid_local = r.uid
LEFT JOIN author p ON p.uid = r2p.uid_foreign
GROUP BY r.pid
) Authors ON r.pid = Authors.pid
对于与references 的每个n:m 关系,此LEFT OUTER JOIN 语句存在多次。查询这些表的最简单方法是什么。请记住,我需要例如ODER BY作者或通过参考的关键字搜索。
编辑:
我尝试的新查询:
SELECT r.*,
GROUP_CONCAT(CONCAT_WS(\' \', CONCAT(a.lastname, \',\'), a.prefix, a.firstname) SEPARATOR \'; \') AS authors,
GROUP_CONCAT(CONCAT_WS(\' \', k.name)) AS keywords,
GROUP_CONCAT(CONCAT_WS(\' \', c.name)) AS categories,
GROUP_CONCAT(CONCAT_WS(\' \', p.name)) AS publishers
FROM reference AS r
LEFT OUTER JOIN (
SELECT * FROM reference_author_mm AS rha
INNER JOIN author AS a ON a.uid = rha.uid_foreign
) AS a ON a.uid_local = r.uid
LEFT OUTER JOIN (
SELECT * FROM reference_keyword_mm AS rhk
INNER JOIN keywords AS k ON k.uid = rhk.uid_foreign
) AS k ON k.uid_local = r.uid
【问题讨论】:
-
请再提供几行显示所需结果。
-
完成。感谢您的关注。
标签: mysql sql query-optimization