由于SQL语法无效,MySQL正在返回错误。
开幕式不平衡。引用“第18行”和“at 30'”很可能是由于MySQL解析器读取了过去什么你认为是语句的结尾,并且进一步阅读,寻找有效的语法来解析。
在问题中发布的SQL是难以理解的混乱。 (它看起来就像是没有计划放在一起;糖化SQL构建在一起,希望这样它会返回一些有用的东西。)
这并不完全清楚,我们期望返回什么结果。没有这些,就不可能提供更多具体的援助。如果没有示例数据和预期结果,我们正在盲目猜测我们正试图实现的目标。
编辑
的问题已被编辑。在SQL中,所有对countries
表的引用都被替换为对sports
的引用。
至少现在有一些(相当模糊)所需行为的描述。
获取sports
表中所有行的mytag
,mytag2
和mytag3
列中的值列表作为单个列。然后将该值列表折叠到不同的列表中,以及标签出现的次数。应该首先列出出现频率最高的标签值。
我们可以这样做:
SELECT t.mytag AS alltag
, COUNT(1) AS cnt
FROM (SELECT t1.mytag
FROM sports t1
UNION ALL
SELECT t2.mytag2
FROM sports t2
UNION ALL
SELECT t3.mytag3
FROM sports t3
) t
GROUP
BY t.mytag
ORDER
BY COUNT(1) DESC
, t.mytag DESC
如果这是不正确的,那么我们就需要修改该查询。
该规范的下一部分含混不清......
“使用值和名称列检查,并是,如果其中的任何值匹配,如果他们这样做显示来自该行的信息”
假设(一会儿)的结果集由以前的查询返回的是我们想要的,并且可以方便地在名为c
的表中提供。
“用该值与名称列检查”,我们可以做这样的事情:
SELECT c.alltag
, c.cnt
FROM c
JOIN sports s
ON s.name = c.alltag
ORDER
BY c.cnt DESC
, c.mytag DESC
的虚构表中的参考c
可以用内嵌视图替换,结果第一个查询返回:
SELECT c.alltag
, c.cnt
, s.sportid
, s.name
, s.mytag
, s.mytag2
, s.mytag3
FROM (
SELECT t.mytag AS alltag
, COUNT(1) AS cnt
FROM (SELECT t1.mytag
FROM sports t1
UNION ALL
SELECT t2.mytag2
FROM sports t2
UNION ALL
SELECT t3.mytag3
FROM sports t3
) t
GROUP
BY t.mytag
ORDER
BY COUNT(1) DESC
, t.mytag DESC
) c
JOIN sports s
ON s.name = c.alltag
ORDER
BY c.cnt DESC
, c.alltag DESC
, s.sportid DESC
该规范并没有给出任何解释,或任何指示,sports
表的一个自联接本身是必需的。没有提及为什么我们需要在mytag,mytag2或mytag3中检查'football'
。
原始查询的那一点令人困惑。鉴于没有提及可能需要的原因,我们省略了自连接和任何其他限制要返回的行的谓词。
查询中的所有内容都应该出于某种原因。如果我们无法解释SQL构造应该包含在查询中的原因,那么该构造不属于查询。
和(再次)...提供例如数据和预期输出会走很长的路向提供可以理解的规范。这将给我们一种方法来确定查询中需要的结构,并给出一个参考,以验证查询返回预期结果。
没有这一点,我们只是猜测。
使用联合,每个查询必须具有相同的数量和列的类型 –
这是我第一次使用联合,所以我有点不确定它是如何工作的,也许最好是我不使用它 – Beck
什么是所有的parens?他们似乎是不平衡的,他们没有明显的理由。 – spencer7593