Select 来自多个表 - 一对多关系
Select from multiple tables - One to Many relation
我有这样的table:
Table 产品
[姓名]
Table 图片
[Product_Id | Url |订单号]
Table 价格
[Product_Id |组合 |货币 |价格]
Table 数量
[Product_Id |组合 |数量]
Table 产品与其他 table 是一对多关系。我需要查询 table 并得到类似这样的结果(伪数组):
[
ProductId: 1,
Name: 'Sample product',
Images: [
[url, 1],
[url, 2]
],
Prices: [
[aaa, USD, 50.00],
[aaa, EUR, 50.00],
[bbb, USD, 59.00],
[bbb, EUR, 59.00]
],
Quantities: [
[aaa, 5],
[bbb, 3]
]
]
我现在的做法是这样的:
我查询所有产品,列出它们的 ID,然后使用 WHERE IN
子句查询每个 table(图片、价格、数量)。当我拥有所有数据后,我开始解析 php 中的 table 以获得所需的结构。
我想知道是否有更好的方法来提取这些数据,我有很多不同的 table 像这样,为它们中的每一个创建配置解析器有点混乱和有问题。有没有可能mysql会替我分担一些负担?
谢谢
使用 JOIN
比 WHERE ... IN ...
.
更简单(如果设置了外键,效率更高)
可以单独查询这些表以获得 Product Id = 1
所需的数据,如下所示:
SELECT i.*
FROM Product prd
INNER JOIN Images i
ON prd.Id = i.Product_Id
WHERE Product_Id = 1;
SELECT prc.*
FROM Product prd
INNER JOIN Prices prc
ON prd.Id = prc.Product_Id
WHERE Product_Id = 1;
SELECT q.*
FROM Product prd
INNER JOIN Quantities q
ON prd.Id = q.Product_Id
WHERE Product_Id = 1;
我建议您有一个包含 ProductID 的所有这些信息的单个结果集,并在 PHP 中解析它。这将使事情变得更简单。
SELECT prd.ProductId, prd.Name, i.Url, i.Ordernumber, prc.Combination, prc.Currency, prc.Price,q.Combination, q.Quantity
FROM Product prd
INNER JOIN Images i
ON prd.Id = i.Product_Id
INNER JOIN Prices prc
ON prd.Id = prc.Product_Id
INNER JOIN Quantities q
ON prd.Id = q.Product_Id
WHERE Product_Id = 1;
此查询将为您解决问题:
SELECT product.id, product.name,
(SELECT group_concat(CONCAT('["',images.url, '",', images.order_number,']')) FROM images WHERE images.product_id = product.id GROUP BY (product.id)) AS IMAGES_LIST,
(SELECT GROUP_CONCAT(CONCAT('["',prices.combination, '","', prices.currency, '",', prices.price,"]" )) FROM prices WHERE prices.product_id = product.id GROUP BY (product.id)) AS PRICE_LIST,
(SELECT GROUP_CONCAT(CONCAT('["',quantites.combination, '",', quantites.quantity,"]")) FROM quantites WHERE quantites.product_id = product.id GROUP BY (product.id)) AS Quantity_LIST
FROM product WHERE product.id = 1
- 首先获取产品
- 对于每个使用子查询的图片,我们都可以获得相关图像,使用组连接我们可以在一个字段中获取它们
- 价格和数量相同
我有这样的table:
Table 产品
[姓名]
Table 图片
[Product_Id | Url |订单号]
Table 价格
[Product_Id |组合 |货币 |价格]
Table 数量
[Product_Id |组合 |数量]
Table 产品与其他 table 是一对多关系。我需要查询 table 并得到类似这样的结果(伪数组):
[
ProductId: 1,
Name: 'Sample product',
Images: [
[url, 1],
[url, 2]
],
Prices: [
[aaa, USD, 50.00],
[aaa, EUR, 50.00],
[bbb, USD, 59.00],
[bbb, EUR, 59.00]
],
Quantities: [
[aaa, 5],
[bbb, 3]
]
]
我现在的做法是这样的:
我查询所有产品,列出它们的 ID,然后使用 WHERE IN
子句查询每个 table(图片、价格、数量)。当我拥有所有数据后,我开始解析 php 中的 table 以获得所需的结构。
我想知道是否有更好的方法来提取这些数据,我有很多不同的 table 像这样,为它们中的每一个创建配置解析器有点混乱和有问题。有没有可能mysql会替我分担一些负担?
谢谢
使用 JOIN
比 WHERE ... IN ...
.
可以单独查询这些表以获得 Product Id = 1
所需的数据,如下所示:
SELECT i.*
FROM Product prd
INNER JOIN Images i
ON prd.Id = i.Product_Id
WHERE Product_Id = 1;
SELECT prc.*
FROM Product prd
INNER JOIN Prices prc
ON prd.Id = prc.Product_Id
WHERE Product_Id = 1;
SELECT q.*
FROM Product prd
INNER JOIN Quantities q
ON prd.Id = q.Product_Id
WHERE Product_Id = 1;
我建议您有一个包含 ProductID 的所有这些信息的单个结果集,并在 PHP 中解析它。这将使事情变得更简单。
SELECT prd.ProductId, prd.Name, i.Url, i.Ordernumber, prc.Combination, prc.Currency, prc.Price,q.Combination, q.Quantity
FROM Product prd
INNER JOIN Images i
ON prd.Id = i.Product_Id
INNER JOIN Prices prc
ON prd.Id = prc.Product_Id
INNER JOIN Quantities q
ON prd.Id = q.Product_Id
WHERE Product_Id = 1;
此查询将为您解决问题:
SELECT product.id, product.name,
(SELECT group_concat(CONCAT('["',images.url, '",', images.order_number,']')) FROM images WHERE images.product_id = product.id GROUP BY (product.id)) AS IMAGES_LIST,
(SELECT GROUP_CONCAT(CONCAT('["',prices.combination, '","', prices.currency, '",', prices.price,"]" )) FROM prices WHERE prices.product_id = product.id GROUP BY (product.id)) AS PRICE_LIST,
(SELECT GROUP_CONCAT(CONCAT('["',quantites.combination, '",', quantites.quantity,"]")) FROM quantites WHERE quantites.product_id = product.id GROUP BY (product.id)) AS Quantity_LIST
FROM product WHERE product.id = 1
- 首先获取产品
- 对于每个使用子查询的图片,我们都可以获得相关图像,使用组连接我们可以在一个字段中获取它们
- 价格和数量相同