我有几张桌子:
资源(包含所有帖子)
pid | usrnm |标题|链接|内容|标题| sdesc |在|喜欢
标签(包含所有标签和ID)
id | sl
重新标记(用于连接资源及其标记)
pid | tid
我正在尝试创建一个搜索引擎,您可以在其中使用多个标签,一个搜索值并按最新或最喜欢的顺序对结果进行排序。
我用于按标签搜索的SQL是:
SELECT
resources.pid, resources.title
FROM resources
INNER JOIN retags ON resources.pid = retags.pid
INNER JOIN tags ON retags.tid = tags.id
GROUP BY resources.pid
HAVING
SUM(tags.slug = 'tag-z')
AND
SUM(tags.slug = 'tag-y')
我如何将SQL应用于搜索值WHERE title LIKE '%bla%'
并为该标签搜索SQL排序ORDER BY at DESC
?
我尝试从选择中进行选择,但是不断出现诸如“重复列pid”,“字段列表中的列'pid'不明确”之类的错误
有人可以帮助我使用此SQL吗?谢谢
我已经尝试了StackOverflow中的所有操作,例如在一个SELECT pid as pid_ ...
甚至两个选择上都使用别名作为列名,但是我仍然不断遇到相同的重复列错误。
编辑:我从以下错误中获取的SQL:
SELECT * FROM
(SELECT * FROM resources
INNER JOIN retags ON resources.pid = retags.pid
INNER JOIN tags ON retags.tid = tags.id
GROUP BY resources.pid
HAVING
SUM(tags.slug = 'A2') AND
SUM(tags.slug = 'AS')
) AS tsr WHERE tsr.title LIKE '%bla%' ORDER BY tsr.`at` DESC
这只是其中之一,我从其他帖子中尝试了很多不同的类型,并且从中得到了不同的错误。
答案 0 :(得分:0)
WHERE
子句在GROUP BY
之前:
SELECT rs.pid, rs.title
FROM resources rs JOIN
retags rt
ON rs.pid = rt.pid JOIN
tags t
ON rt.tid = t.id
WHERE rs.title LIKE '%bla%'
GROUP BY rs.pid
HAVING SUM(t.slug = 'tag-z') AND
SUM(t.slug = 'tag-y')
ORDER BY MAX(rs.at);
严格来说,假设MAX()
唯一地标识ORDER BY
中的每一行,pid
中就不需要resources
。
我的猜测是at
在多行中,因此您需要使用引用来自的表来限定引用。请注意,我引入了表别名,因此查询更易于编写和阅读。