我有这个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?
似乎不起作用
答案 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'
在此更新小提琴的最后一个查询中看到的