繁体   English   中英

MYSQL / PHP:具有多个联接的查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM