MYSQL / PHP:使用多个连接进行查询

时间:2016-12-07 22:41:18

标签: php mysql sql

我正在尝试获取以下查询以返回正确的信息,但它会为同一个表中的字段返回不同数量的值。

我的数据架构是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字段中的值都包含不同的值。在实际的表格中,我已基本消除了缺失值,因此无法解释元素数量的差异。查询似乎有问题。

有人可以发现我的错误吗?几天来一直苦苦挣扎。

2 个答案:

答案 0 :(得分:0)

通常,聚合和连接的问题是连接产生用于匹配键的笛卡尔积。在英语中,这意味着您要加入多个维度并为同一个用户获取不同项目的所有组合。

你能做什么?快速而肮脏的解决方案是使用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可能无法在您的情况下使用。

答案 1 :(得分:0)

与大多数聚合函数一样,

GROUP_CONCAT忽略NULL值。由于您使用的是左连接,因此对于某些预聚合结果行,这些连接右侧表中的任何GROUP_CONCAT字段都可能具有空值。

编辑:如果你想要综合"结果"对于缺少数据,您可以汇总计算值;你实际上已经这样做了一次...

group_concat(IFNULL(t.ltrav,'')) as `ltravs`

....你可以稍微进一步(使这些数据的缺乏更明显)用这样的东西:

GROUP_CONCAT(IFNULL(theField, '[Not Recorded]')) AS theList