gpt4 book ai didi

php - 查询多个表行的重复记录

转载 作者:行者123 更新时间:2023-11-29 18:04:21 25 4
gpt4 key购买 nike

我有这个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

它返回此数据,image

实现这种json格式确实很繁琐

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

我应该修复我的 sql 查询,或者我必须使用 PHP 进行手动循环来生成 json,这太乏味了?

尝试过不同的 https://i.imgur.com/tZFvKAD.png

似乎不起作用

最佳答案

这是我正在谈论的内容的 super 简化版本。

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

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

如数据库 fiddle 中所示

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'

如在此更新的 fiddle 中的最后一个查询中所示

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

关于php - 查询多个表行的重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com