【问题标题】:Why is this WHERE clause not working with Join?为什么这个 WHERE 子句不能与 Join 一起使用?
【发布时间】:2012-10-13 04:52:12
【问题描述】:

我对 SQL 很陌生,这是一个相当复杂的命令:

SELECT users.name, 
       from_unixtime(activity.time_stamp, "%D %b %Y  %l:%i:%S"), 
      activity.activity, 
      activity.rfid_tag, 
      chemicals.description 
FROM activity 
JOIN chemicals ON chemicals.bar_code = activity.bar_code 
JOIN users ON users.badge_number=activity.badge_number 
WHERE  (activity="login") 
    OR (activity="logout") 
   OR (activity LIKE "Admin:%") 
   OR (activity="tag") 
   OR (activity="untag") 
   OR (activity LIKE "check out%") 
   OR (activity LIKE "pour%") 
   OR (activity="check out (unscheduled)") 
   OR (activity="not poured after checking out") 
   OR (activity LIKE "invalid:%") 
ORDER BY time_stamp DESC

当我运行它时,它返回与 WHERE 的最后一个 OR 匹配的行(867 中的 723)。例如,我没有看到 activity="login" 的任何行,但 SELECT * FROM activity WHERE activity="login" 确实返回了一些行。

我做错了什么? (如果应该是“INNER JOIN”)?

更新

在我添加 Join 之前,我应该说这是有效的(使用复杂的 WHERE)(而且我是一个 SQL 初学者)。

【问题讨论】:

  • activity是表名,也是列名o_0
  • 好的,但是您还要添加条件,activity="login"chemicals.bar_code = activity.bar_codeusers.badge_number=activity.badge_number 条件仍然成立吗?
  • bar_codebadge_number 可以为空字段吗?如果是这样,那么chemicals 和/或users 上的连接可能应该是LEFT JOINs。
  • 如果你改变了ORs的顺序,你还是得到最后一个OR,还是OR (activity LIKE "invalid:%")
  • @TheDOCTORfromTARDIS 为什么 mysql 会将值与表名匹配?

标签: mysql sql


【解决方案1】:

请研究INNER JOIN and LEFT JOIN之间的区别。

通过查看您的查询和基于名称并与现实世界实体相关联的水晶球凝视,我可以看到以下内容:

当您的活动是“倒”时,它可能涉及一些化学物质,这些化学物质会成功加入条形码。当它是“登录”时,我怀疑你会在化学表上获得成功的(INNER)JOIN。正如有人提到的,你真的想把它们变成 LEFT JOIN,例如

SELECT users.name, 
       from_unixtime(activity.time_stamp, "%D %b %Y  %l:%i:%S"), 
      activity.activity, 
      activity.rfid_tag, 
      chemicals.description 
FROM activity 
LEFT JOIN chemicals ON chemicals.bar_code = activity.bar_code 
LEFT JOIN users ON users.badge_number=activity.badge_number 
WHERE  (activity="login") 
   OR (activity="logout") 
   OR (activity LIKE "Admin:%") 
   OR (activity="tag") 
   OR (activity="untag") 
   OR (activity LIKE "check out%") 
   OR (activity LIKE "pour%") 
   OR (activity="check out (unscheduled)") 
   OR (activity="not poured after checking out") 
   OR (activity LIKE "invalid:%") 
ORDER BY time_stamp DESC

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2022-01-20
    相关资源
    最近更新 更多