mysql - LEFT JOIN 返回不等于 ON 的结果

标签 mysql

我有这个 mysql 查询

SELECT bm_events.name AS event_name,
       bm_events.uid AS event_uid,
       bm_events.organising,
       bm_organising_company.uid,
       bm_organising_company.name
FROM bm_events LEFT JOIN bm_organising_company
     ON bm_events.organising = bm_organising_company.uid 

这是结果

Acontraluz  68  66,90   66  Advanced Music S.L.

列“bm_events.organising”是一个带有逗号分隔值的varchar。

因此,由于 bm_events 表上的“bm_events.organising”等于“66,90”,我预计 bm_organising_company.uid、bm_organising_company.name 不会有结果。

您能向我解释一下为什么我得到 bm_organising_company.uid = 66 的结果吗?

谢谢:)

最佳答案

这是您的查询:

SELECT e.name as event_name, e.uid as event_uid, e.organising, oc.uid, oc.name
from bm_events e left join
     bm_organising_company oc
     on e.organising = oc.uid 

正如评论中提到的,您对字符串和数字进行了比较。这是您的问题的表现,您可以使用 find_in_set() 修复它:

on find_in_set(oc.uid, e.organizing)

但是,这不是问题的根源。问题的主要原因是您将整数列表存储在字符串中。以下是您不想这样做的原因:

  • 值应以正确的类型存储,因此数字应存储为数字。
  • ID 的外键引用应该有问题。您不能使用字符串来执行此操作。
  • 比较的语义令人困惑。
  • SQL 具有正确的列表数据结构。它们被称为“表”。
  • 生成的查询无法利用索引,因此未进行优化。

因此,您应该有一个名为 OrganizingUsers 的表,其中每个“事件”和每个“用户”一行。这称为联结表,是在 SQL 中表示列表的正确方法。

关于mysql - LEFT JOIN 返回不等于 ON 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674019/

相关文章:

mysql - 从数据库中的多个表返回数据

mysql - Pphunit 不断给出错误 : [1049] Unknown database ':memory:'

php - 在多对多关系设置中选择

mysql - 匹配一行内的不同值

javascript - 如果 axios post 有多个输入,如何仅将一个值的邮件发送到后端

php - 调用第 46 行\sites\all\modules\community\entityreference\entityreference.install 中未定义的函数entityreference_get_behavior_handlers()

MySQL 分组和排序

mysql - 使用 MySQL 的 GROUP BY/HAVING 的替代方案

mysql - 无法通过 SonarQube WS API 找到所有问题

php - 使用 UNIX_TIMESTAMP() 会减慢我的 INSERT 查询吗