如何从mysql多对多选择中将单个值组合为数组?

问题描述 投票:2回答:2

我有三个表,一个用于商业列表,一个用于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"] } }
mysql sql
2个回答
0
投票

正如@rickdenhaan评论的那样,GROUP_CONCAT()似乎非常接近你所寻找的。这不会生成types数组,而是以逗号分隔的列表。另一个奇特的选择是生成一个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 JOININNER JOIN,那么使用business_listingss而不是dining_typess可能是一个好主意。


0
投票

根据您的输出数据,我假设您正在使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.