[英]MYSQL/PHP: Query with multiple joins
我试图获取以下查询以返回正确的信息,但是它为同一张表中的字段返回不同数量的值。
我的数据架构是3表:
airlines
id|descript|userid
travelers
id|airid|ftrav|ltrav|active
travair
id|travid|airid
这是查询:
SELECT a.id as `aid`,a.descript,userid,
group_concat(t.id) as `tids`,
group_concat(t.ftrav) as `ftravs`,
group_concat(IFNULL(t.ltrav,'')) as `ltravs`,
group_concat(t.active) as `tactives`,
ta.airid
FROM airlines `a`
LEFT JOIN travair `ta`
ON a.id = ta.airid
LEFT JOIN travelers `t`
ON ta.travid = t.id
WHERE a.userid='$userid'
GROUP BY a.id
基本上,我试图查询航空公司表以获取航空公司,但也通过将两者连接的ta表来拉动每个航空公司的旅客。
但是,group_concat字段中的所有值均不同。 在实际表中,我已在很大程度上消除了缺失值,因此不会考虑元素数量上的差异。 查询似乎有问题。
谁能发现我的错误? 已经为此苦苦挣扎了几天。
通常,聚合和联接的问题是联接产生用于匹配键的笛卡尔乘积。 用英语来说,这意味着您要沿着多个维度加入,并为同一用户获取不同项目的所有组合。
你能做什么? 快速简便的解决方案是使用distinct
关键字:
SELECT a.id as `aid`,a.descript,userid,
group_concat(distinct t.id) as `tids`,
group_concat(distinct t.ftrav) as `ftravs`,
group_concat(distinct coalesce(t.ltrav, '')) as `ltravs`,
group_concat(distinct t.active) as `tactives`
更具可扩展性的解决方案是预先汇总每个维度,以沿每个维度获取列表。
注意:如果您碰巧希望所有列表的长度都相同,则在您的情况下, distinct
可能不起作用。
像大多数聚合函数一样, GROUP_CONCAT
忽略NULL值。 由于您使用的是左联接,因此这些联接右侧表中字段的任何GROUP_CONCAT
可能对于某些预聚合结果行具有空值。
编辑:如果要为缺少的数据综合“结果”,则可以汇总计算值; 您实际上已经这样做过一次...
group_concat(IFNULL(t.ltrav,'')) as `ltravs`
....您可以通过以下方式将其进一步扩展(使该数据的缺乏更加明显):
GROUP_CONCAT(IFNULL(theField, '[Not Recorded]')) AS theList
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.