重复记录查询多个表行

时间:2017-12-31 06:51:08

标签: php mysql sql

我有这个sql从不同的表中查询

SELECT * 
FROM `person` 
  LEFT JOIN person_address 
    ON person_address.person_id=person.person_id 
  LEFT JOIN address_type 
    ON address_type.address_type_id=person_address.address_type_id

它会返回此数据to create block scope

实现这种json格式真的很乏味

//json
[{
  "person_id":"1",
  "full_name":"john",
  "scores": [{
    "address_type":"billing",
    "address_name":"Spain"
  },{
    "address_type":"home",
    "address_name":"USA"
  }]
}]

我应该修复我的sql查询,或者我需要使用PHP手动循环来生成json?

尝试过DISTINCT image

似乎不起作用

1 个答案:

答案 0 :(得分:0)

这是我正在谈论的超简化版本。

鉴于此架构(简单多对多)

CREATE TABLE a(
  id INT(10)
);

INSERT INTO a (id)VALUES(1);
INSERT INTO a (id)VALUES(2);

CREATE TABLE b(
  a_id INT(10),
  c_id INT(10)
);

INSERT INTO b (a_id,c_id)VALUES(1,1);
INSERT INTO b (a_id,c_id)VALUES(1,2);
INSERT INTO b (a_id,c_id)VALUES(2,1);
INSERT INTO b (a_id,c_id)VALUES(2,2);

CREATE TABLE c(
  id INT(10),
  val VARCHAR(255)
);

INSERT INTO c (id,val)VALUES(1,'one');

现在,如果您运行此查询:

SELECT
 c.val AS c_val
FROM
 a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
WHERE
 c.id = 1;

您将获得此结果

'one'
'one'

但是如果你运行这个查询

SELECT
  b.a_id,
  b.c_id,
  c.val AS c_val
FROM
  a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id;

只显示您将看到的所有内容

a_id  | c_id |  c_val
1    |   1   |   one
2    |   1   |   one

在这个DB小提琴中看到了

https://www.db-fiddle.com/f/fZnRCSXeu3wYVFzn4NBjC5/0

这很清楚为什么在这个简单的例子中,但在更复杂的情况下,它可能不那么清楚。如果where子句匹配最后一个表中的多行,则尤其如此。

除此之外,您应该将桥表中的键(上例中的b)设置为来自其他2个表的id的复合主键。

现在修复第一个查询的方法是简单地向其添加DISTINCT

SELECT DISTINCT
 c.val AS c_val
FROM
 a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
WHERE
 c.id = 1;

现在输出

'one'

在此更新小提琴的最后一个查询中看到的

https://www.db-fiddle.com/f/fZnRCSXeu3wYVFzn4NBjC5/1