我有这个 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/