LEFT JOIN返回结果不等于ON

时间:2015-07-28 10:43:46

标签: 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.organising”在bm_events表上等于“66,90”,我希望bm_organising_company.uid,bm_organising_company.name没有结果。

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

谢谢:)

1 个答案:

答案 0 :(得分:0)

这是您的查询:

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)

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

  • 值应存储在正确的类型中,因此数字应存储为数字。
  • Ids应该有外键引用问题。你不能用字符串来做这件事。
  • 比较的语义令人困惑。
  • SQL具有正确的列表数据结构。它们被称为“表格”。
  • 生成的查询无法利用索引,因此未对其进行优化。

所以,你应该有一个名为OrganizingUsers的表,每个“event”有一行,每个“user”。这称为联结表,是在SQL中表示列表的正确方法。

相关问题