0

我正在构建一个搜索页面,其中表单将变量传递给 SQL 查询。如果我输入任何搜索参数,我会得到我想要的结果,除非我将作者或主题搜索留空,否则如果有多个作者和/或与结果相关联的主题,我将得到多个结果。我的大部分记录都有多个作者或多个主题。

基本问题是,如果有 2 个作者和 3 个相关主题的记录,那么我会得到 6 个结果。

我要达到的目标:我正在尝试修改查询,以便我只收到一条记录(record_ID 是唯一的),即使有多个作者或多个主题。

我遇到问题的查询中的 2 JOINS 是拉作者和主题。例如,为了获取作者,我使用这个连接(主题 JOIN 几乎相同),变量 $fauthor 是从 php 传入的:

SELECT la.author, la.author_ID, ra.record_ID
FROM lib_author AS la
JOIN record_author AS ra ON la.author_ID = ra.author_ID
JOIN lib_record AS lr ON ra.record_ID = lr.record_ID
WHERE la.author LIKE '%$fauthor%'

关联的表是 lib_author [author_ID, author]、lib_record [record_ID, ...] 和 record_author [record_ID, author_ID]

这是完整的查询:

select a.record_ID, a.year, n.title, y.author, y.author_ID, j.journal, pox.publisher, lox.language, a.volume, a.issue, a.pages, a.abstract, s.subject
   FROM lib_record AS a  
   JOIN lib_title as n on n.title_ID = a.title_ID
   JOIN (SELECT la.author, la.author_ID, ra.record_ID
       FROM lib_author AS la
       JOIN record_author AS ra ON la.author_ID = ra.author_ID
       JOIN lib_record AS lr ON ra.record_ID = lr.record_ID
            WHERE la.author LIKE '%$fauthor%') AS y 
   JOIN (SELECT ls.subject, ls.subject_ID, rs.record_ID 
        FROM lib_subject AS ls
        JOIN record_subject AS rs ON ls.subject_ID = rs.subject_ID
        JOIN lib_record AS lr ON rs.record_ID = lr.record_ID
            WHERE ls.subject LIKE '%$fsubject%') AS s
   JOIN lib_journal AS j on j.journal_ID = a.journal_ID
   JOIN lib_publisher pox ON a.publisher_ID = pox.publisher_ID
   JOIN lib_language lox ON a.language_ID = lox.language_ID
   WHERE y.record_ID = a.record_ID 
   AND s.record_ID = a.record_ID
   AND n.title LIKE '%$ftitle%'
   AND j.journal LIKE '%$fjournal%'

我希望有人有一些见识。谢谢

4

2 回答 2

0

我相信您只想按record_ID对结果进行分组。使用您更简单的查询:

选择 la.author、la.author_ID、ra.record_ID
  FROM lib_author AS la
  加入 record_author AS ra ON la.author_ID = ra.author_ID
  加入 lib_record AS lr ON ra.record_ID = lr.record_ID
  WHERE la.author LIKE '%$fauthor%'
  按 ra.record_ID 分组

这将获取 la.* 的最后一个条目。如果你想要一个以逗号分隔的作者列表,你可以使用 group_concat()。

于 2013-04-15T21:30:47.123 回答
0

这是最后一个查询,在末尾添加了 GROUP BY,并将 GROUP_CONCAT 添加到作者和主题 JOINS 以显示完整的数据集。感谢@Doug Kress 的帮助!我只是一个志愿者网站管理员:

select a.record_ID, a.year, n.title, GROUP_CONCAT(DISTINCT y.author SEPARATOR '; ') AS author, y.author_ID, j.journal, pox.publisher, lox.language, a.volume, a.issue, a.pages, a.abstract, GROUP_CONCAT(DISTINCT s.subject SEPARATOR '; ') AS subject
   FROM lib_record AS a  
   JOIN lib_title as n on n.title_ID = a.title_ID
   JOIN (SELECT la.author, la.author_ID, ra.record_ID
       FROM lib_author AS la
       JOIN record_author AS ra ON la.author_ID = ra.author_ID
       JOIN lib_record AS lr ON ra.record_ID = lr.record_ID
            WHERE la.author LIKE '%$fauthor%') AS y 
   JOIN (SELECT ls.subject, ls.subject_ID, rs.record_ID 
        FROM lib_subject AS ls
        JOIN record_subject AS rs ON ls.subject_ID = rs.subject_ID
        JOIN lib_record AS lr ON rs.record_ID = lr.record_ID
            WHERE ls.subject LIKE '%$fsubject%') AS s
   JOIN lib_journal AS j on j.journal_ID = a.journal_ID
   JOIN lib_publisher pox ON a.publisher_ID = pox.publisher_ID
   JOIN lib_language lox ON a.language_ID = lox.language_ID
   WHERE y.record_ID = a.record_ID 
   AND s.record_ID = a.record_ID
   AND n.title LIKE '%$ftitle%'
   AND j.journal LIKE '%$fjournal%' 
   GROUP BY a.record_ID
于 2013-04-16T03:41:55.420 回答