1

私は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"いくつかの行が返されます。

私は何が間違っているのですか?(そしてそれが「INNERJOIN」である必要がある場合)?

アップデート

結合を追加する前に、これは(複雑なWHEREで)機能していると言っておく必要がありました(そして私は完全なSQL初心者です)。

4

1 に答える 1

4

INNERJOINとLEFTJOINの違いを調べてください。

名前に基づいてクエリと水晶玉を注視し、現実世界のエンティティと相関させることから、私が見ることができるものは次のとおりです。

あなたの活動が「注ぐ」とき、それはバーコードでうまく結合するいくつかの化学物質を含むかもしれません。「ログイン」の場合、化学テーブルに対して(内部)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
于 2012-10-13T05:08:14.193 に答える