mysql - 为什么此 WHERE 子句不适用于 Join?

标签 mysql sql

我对 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 匹配的行(723 来自 867)。例如,我没有看到 activity="login"的任何行,但是 SELECT * FROM activity WHERE activity="login" 确实返回了一些行。

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

更新

在我添加 Join 之前,我应该说这是有效的(对于复杂的 WHERE)(我是一个完全的 SQL 初学者)。

最佳答案

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

通过查看您的查询和基于名称的 Crystal 球注视以及与现实世界实体的关联,我可以看到以下内容:

当你的事件是“倒”的时候,可能会涉及到一些化学物质,这些化学物质会在条形码上成功加入。当它是“登录”时,我怀疑您是否会针对化学表获得成功的(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

关于mysql - 为什么此 WHERE 子句不适用于 Join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12870068/

相关文章:

php - 试图获取非对象 CodeIgniter 框架的属性

mysql - 数据库规范化与数据标识符

php - 如何获取 php mysql 数据库中最后受影响的行的 id?

sql - SQL 中的 TRUNCATE 和 DELETE 有什么区别

sql - Oracle 连接查询

c# - 根据下拉列表在 asp.net 中选择的选项从文件夹动态加载多个图像

php - 使用 $wpdb->prepare() 时出错

php - mysql 选择之前 n 行和之后 n 行

mysql - 查询记录的最佳方式

php - SELECT COUNT(id) 没有给我正确的值