MySQL - 子查询 - SQL 语法错误

Posted

技术标签:

【中文标题】MySQL - 子查询 - SQL 语法错误【英文标题】:MySQL - SubQuery - Error in your SQL Syntax 【发布时间】:2012-04-02 18:17:20 【问题描述】:

我对 SQL 还是很陌生,所以我会尽量保持简单,我想做什么。

我有一个系统,我希望从中选择消息,首先从最近的开始,最多选择 5 条数据,然后在最后使用最新的“时间”列对它们进行排序正常显示。

这是我使用的语法:

SELECT * FROM messages WHERE sender = '$uid' AND reciever = '$new_user_id' 
OR reciever = '$uid' AND sender = '$new_user_id' ORDER BY id ASC 
FROM (SELECT * FROM messages ORDER BY time DESC)

这是我得到的错误:

您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 靠近第 1 行的“FROM (SELECT * FROM messages ORDER BY time DESC)”

我知道我在这里弄错了,但由于 SQL 不是我真正的东西,我不知道该转向哪里。

一点点帮助就能成就大事业,我已经把头撞在墙上好几个小时了。

谢谢。

【问题讨论】:

可能是因为你定义了FROM 两次? 刚刚编辑它显然我似乎错过了第二个 FROM 之前的 ORDER BY。 您仍在使用两个FROM 语句。尝试将查询分解为子部分(正如我在回答中所做的那样),它可以帮助您更好地了解逻辑。 ;) 【参考方案1】:

试试这个:

SELECT * 
  FROM (SELECT * FROM messages ORDER BY time DESC LIMIT 5)
  WHERE ( sender = '$uid' 
    AND reciever = '$new_user_id' )
    OR ( reciever = '$uid' 
    AND sender = '$new_user_id' )
  ORDER BY time ASC;

编辑已编辑为在插入的最后 5 个项目中使用升序时间值。

【讨论】:

你能再检查一下查询吗,对不起,我在第一个查询中犯了一个错误,因为我有两个版本的查询。 谢谢,这应该可以帮助我把它整理好!【参考方案2】:
SELECT * FROM (
    SELECT *
    FROM messages 
    WHERE
    (sender = '$uid' AND reciever = '$new_user_id')
    OR (reciever = '$uid' AND sender = '$new_user_id')
    ORDER BY time asc
    LIMIT 5) AS a ORDER by a.time DESC

【讨论】:

【参考方案3】:

似乎不需要子查询。取消子查询并添加 ORDER BY time DESC LIMIT 5。

【讨论】:

你能再检查一下查询吗,对不起,我在第一个查询中犯了一个错误,因为我有两个版本的查询。

以上是关于MySQL - 子查询 - SQL 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer语法常用总结

带有子查询的 MySQL 删除给出了语法错误

使用 FROM 子句中的子查询进行联接操作中的 SQL 语法错误

MySQL进阶8 分页查询(limit) - SQL查询语法顺序及大致结构- 子查询的3个经典案例

sql - 添加子查询时查询语法问题

MySQL的SQL语句 - 数据操作语句(13)- 子查询(11)