从select

时间:2019-06-15 18:33:09

标签: mysql sql

我有几张桌子:

  • 资源(包含所有帖子)

    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

这只是其中之一,我从其他帖子中尝试了很多不同的类型,并且从中得到了不同的错误。

1 个答案:

答案 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在多行中,因此您需要使用引用来自的表来限定引用。请注意,我引入了表别名,因此查询更易于编写和阅读。