我有三个表,一个用于商业列表,一个用于dining_types,一个用于dining_listing_types。
business_listings:
+--------+------------------+------------------+
| id | business_type | business_name |
+--------+------------------+------------------+
| 1 | 1 | china house |
+--------+------------------+------------------+
dining_listing_types:
+--------+------------------+------------------+
| id | listing_id | type_id |
+--------+------------------+------------------+
| 1 | 1 | 1 |
+--------+------------------+------------------+
| 2 | 1 | 3 |
+--------+------------------+------------------+
dining_types:
+--------+------------------+
| id | type |
+--------+------------------+
| 1 | Asian |
+--------+------------------+
| 2 | Italian |
+--------+------------------+
| 3 | Chinese |
+--------+------------------+
如您所见,列表可以有多种类型,dining_listing_types表用作“中间人”表。
但是,当我尝试在查询中使用联接时,我会找回两条记录
SELECT bl.id AS id, bl.business_name AS name, dt.type AS type
FROM business_listings bl
JOIN dining_listing_types dlt ON bl.id = dlt.listing_id
JOIN dining_types dt ON dlt.type_id = dt.id
结果:
array(2) { [0]=> object(stdClass)#7 (3) { ["id"]=> string(1) "1" ["name"]=>
string(23) "China House" ["type"]=> string(5) "Asian" } [1]=>
object(stdClass)#8 (3) { ["id"]=> string(1) "1" ["name"]=> string(23) "China
House" ["type"]=> string(18) "Chinese" } }
我不要那个。我尝试了一个GROUP BY bl.id
,我找回了一条记录,但另一种类型丢失了:
SELECT bl.id AS id, bl.business_name AS name, dt.type AS type
FROM business_listings bl
JOIN dining_listing_types dlt ON bl.id = dlt.listing_id
JOIN dining_types dt ON dlt.type_id = dt.id
GROUP BY bl.id
结果:
array(1) { [0]=> object(stdClass)#7 (3) { ["id"]=> string(1) "1" ["name"]=>
string(23) "China House" ["type"]=> string(5) "Asian" } }
我想要的结果:
array(1) { [0]=> object(stdClass)#7 (3) { ["id"]=> string(1) "1" ["name"]=>
string(23) "China House" ["type"]=> array(2) ["Asian", "Chinese"] } }
正如@rickdenhaan评论的那样,GROUP_CONCAT()
似乎非常接近你所寻找的。这不会生成type
s数组,而是以逗号分隔的列表。另一个奇特的选择是生成一个JSON数组,但我不确定这在这里真的有用。
为了使其按预期工作,您需要将business_name
添加到非聚合列的列表中:
SELECT bl.id AS id, bl.business_name AS name, GROUP_CONCAT(dt.type) AS types
FROM business_listings bl
INNER JOIN dining_listing_types dlt ON bl.id = dlt.listing_id
INNER JOIN dining_types dt ON dlt.type_id = dt.id
GROUP BY bl.id, bl.business_name
注意:正如@spencer7593评论的那样,如果我们需要返回没有相关LEFT JOIN
的INNER JOIN
,那么使用business_listings
s而不是dining_types
s可能是一个好主意。
根据您的输出数据,我假设您正在使用PHP。如果你正在使用mysqli
类(连接$conn
),你可以用这样的东西实现你想要的东西(使用@rickdenhaan建议的GROUP_CONCAT
):
$sql = 'SELECT bl.id AS id, bl.business_name AS name, GROUP_CONCAT(dt.type) AS type
FROM business_listings bl
LEFT JOIN dining_listing_types dlt ON bl.id = dlt.listing_id
LEFT JOIN dining_types dt ON dlt.type_id = dt.id
GROUP BY bl.id, bl.business_name';
$result = $conn->query($sql) or die($conn->error);
while ($obj = $result->fetch_object()) {
$obj->type = explode(',', $obj->type);
// do something with $obj
}