【问题标题】:Syntax error or access violation when trying to select distrinct尝试选择不同时出现语法错误或访问冲突
【发布时间】:2021-08-06 13:33:16
【问题描述】:

老实说,我不确定为什么会出现错误,因为我刚刚将两个选择移到了不同​​的区域并在左外连接中,但它们之前在主打开选择语句中工作过

SELECT body, timestamp FROM chats 
LEFT OUTER JOIN messages ON chats.id = messages.chat_id 
LEFT OUTER JOIN (SELECT DISTINCT sender.first_name AS sender_first_name, sender.last_name AS sender_last_name,
sender.username AS sender_username) users AS sender ON chats.from_user_id = sender.id 
LEFT OUTER JOIN (SELECT DISTINCT reciever.first_name AS reciever_first_name, reciever.last_name AS reciever_last_name,
reciever.username AS reciever_username) users AS reciever ON chats.to_user_id = reciever.id 
WHERE from_user_id = :fromUserId AND to_user_id = :toUserId

也尝试过使用 FROM 子句

LEFT OUTER JOIN (SELECT DISTINCT sender.first_name AS sender_first_name, sender.last_name AS sender_last_name,
                                sender.username AS sender_username FROM users) users AS sender ON chats.from_user_id = sender.id 

【问题讨论】:

  • 你能解释一下:fromUserId在这里是什么意思吗?你从哪里执行这个查询?该错误似乎与语法无关,但可能与其他问题有关。
  • @TimBiegeleisen 我稍后会绑定它。在我将选择更改为 distrinct 并在左外连接内之前,该部分工作得很好。
  • 您的子查询不包含 FROM 子句。
  • 似乎子查询中的) users实际上应该是FROM users)
  • 嘿,戈登,这看起来很有希望。 DISTINCT 应​​该做到这一点,所以我可以为用户获取一次记录,但为聊天获取多个记录

标签: mysql sql join mariadb relational-database


【解决方案1】:

这不是一个有效的子查询:

(SELECT DISTINCT sender.first_name AS sender_first_name, sender.last_name AS sender_last_name,
 sender.username AS sender_username) users AS sender 

您还没有解释查询应该做什么,但我推测您想要:

SELECT body, timestamp,
       us.first_name AS sender_first_name, us.last_name AS sender_last_name, us.username AS sender_username
       ur.first_name AS receiver_first_name, ur.last_name AS receiver_last_name, ur.username AS receiver_username
FROM chats c LEFT OUTER JOIN
     messages m
     ON c.id = m.chat_id LEFT OUTER JOIN
     users us
     ON c.from_user_id = us.id LEFT OUTER JOIN
     users ur
     ON c.to_user_id = ur.id 
WHERE c.from_user_id = :fromUserId AND c.to_user_id = :toUserId;

在加入id 上的表时,您应该不需要DISTINCT

【讨论】:

  • 确实,你并不总是需要DISTINCT,但这是一个好习惯,尤其是对于最外层的SELECT——即使你在其他表中LEFT OUTER JOIN。操作中的问题。正如 cmets 指出的那样,嵌套的 (SELECT ...) 内是否没有 FROM users。幸运的是,您的答案“逃脱”而没有嵌套;但是如果连接的表之间存在列名冲突怎么办?这个答案看起来像是“一场等待发生的灾难”,在这里引用某人的话。
  • @AntC 。 . .这正是编写查询的一种糟糕可怕可怕的方式。首先,select distinct 会产生开销,因此只能在必要时使用它。更重要的是,它不应该用于删除重复项,除非查询编写者彻底理解数据和查询以及为什么会出现不同的值。
  • 啊,因为在这里问一个 q 的新手当然会“彻底理解”为什么会有重复的行,以及(比如)COUNT(*) 的后果可能意味着什么。
  • @GordonLinoff:确切地说是什么开销(假设子查询是按 id)?
  • 给出的答案正确识别了 OP 查询的句法问题。 (SELECT ... ) users AS ... 至少应该变成 (SELECT ... FROM users) AS ... 。至于所选列的集合在 Op 和给出的答案之间不相等,非常清楚地表明“我 推测 你想要......”。如果 OP 首先能够证明“问题是正确的”,也许您只想在这里看到问题的答案?
猜你喜欢
  • 2022-01-12
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2018-02-06
  • 2013-05-07
相关资源
最近更新 更多