2017-04-19 164 views
-1

当试图运行此查询我得到以下信息MySQL的 - 1064 - 你在你的SQL语法错误有一个错误

#1064 - 你在你的SQL语法错误;检查对应于你的MySQL服务器版本在线路附近使用“30”正确的语法手册18

我不知道这意味着什么作为我的代码没有一行18也不具有“ 30' 所以我不清楚,为什么它说接近‘30’

SELECT * from (SELECT myTag 
FROM (SELECT myTag 
FROM sports) 
UNION ALL 
(SELECT myTag2 myTag 
FROM sports) as sport3 
UNION ALL 
(SELECT myTag3 myTag 
FROM sports) alltags 
GROUP BY myTag) as sport 
ORDER BY COUNT(*)as sport2) 
FROM (SELECT * 
    FROM sports b 
    join sports a 
    on a.myTag = b.Name 
    where a.sportID <> b.sportID and a.myTag2 = 'football' or a.myTag = 'football' or a.myTag3 = 'football') 

Table

我想拿起从myTag,myTag2和MyTag3中最常见的值,然后使用该值,并检查与名称列,并且如果这些值中的任何一个匹配,并且他们显示y来自该行的信息

+0

使用联合,每个查询必须具有相同的数量和列的类型 –

+0

这是我第一次使用联合,所以我有点不确定它是如何工作的,也许最好是我不使用它 – Beck

+0

什么是所有的parens?他们似乎是不平衡的,他们没有明显的理由。 – spencer7593

回答

0

由于SQL语法无效,MySQL正在返回错误。

开幕式不平衡。引用“第18行”和“at 30'”很可能是由于MySQL解析器读取了过去什么你认为是语句的结尾,并且进一步阅读,寻找有效的语法来解析。

在问题中发布的SQL是难以理解的混乱。 (它看起来就像是没有计划放在一起;糖化SQL构建在一起,希望这样它会返回一些有用的东西。)

这并不完全清楚,我们期望返回什么结果。没有这些,就不可能提供更多具体的援助。如果没有示例数据预期结果,我们正在盲目猜测我们正试图实现的目标。

编辑

的问题已被编辑。在SQL中,所有对countries表的引用都被替换为对sports的引用。

至少现在有一些(相当模糊)所需行为的描述。

获取sports表中所有行的mytag,mytag2mytag3列中的值列表作为单个列。然后将该值列表折叠到不同的列表中,以及标签出现的次数。应该首先列出出现频率最高的标签值。

我们可以这样做:

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构造应该包含在查询中的原因,那么该构造不属于查询。


和(再次)...提供例如数据预期输出会走很长的路向提供可以理解的规范。这将给我们一种方法来确定查询中需要的结构,并给出一个参考,以验证查询返回预期结果。

没有这一点,我们只是猜测。

+0

我更新了问题 – Beck

+0

感谢您的帮助:-) – Beck

相关问题