我已经为此寻找了几个小时,但我无法找到合适的解决方案。我将从虚构的表格开始说出我期待的结果。解析sql查询后,我想返回这样的内容:
[
{
"storeID": 1,
"storeName": "best store ever",
"products": [
{
"productID": 1,
"productName": "Name1",
"productPrice": 10.00
},
{
"productID": 2,
"productName": "Name2",
"productPrice": 10.00
},
{
"productID": 3,
"productName": "Name3",
"productPrice": 10.00
},
...
],
"employees": [
{
"employeeID": 1,
"employeeName": "Name1",
"employeeSalary": 40000.00
},
{
"employeeID": 2,
"employeeName": "Name1",
"employeeSalary": 45000.00
},
...
]
},
...
]
我的问题是将stores表与products和employees表连接起来。现在我正在这样做:
SELECT
s.storeID,
s.storeName,
p.productID,
p.productName,
p.productPrice,
e.employeeID,
e.employeeName,
e.employeeSalary,
FROM stores AS s
LEFT JOIN products AS p ON p.fk_store_id = s.storeID
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID;
有了这个,我得到的产品x员工每个商店的行数,这是一个重大的开销。如果我可以获得产品+员工的行数,那就没问题了。但这似乎与做两个单独的查询相同......一个用于加入产品的商店,另一个用于加入员工的商店。
对此更合适的解决方案是什么?
答案 0 :(得分:2)
您在此尝试的联接类型不适合LEFT加入。在3个表之间进行连接时:A,B和C;表A和B首先连接,然后与此连接的结果连接,表C将连接。因此,如果表B和C都具有连接到表A的所有行的数据,那么行的总数将是n(A)* n(B)* n(C)。
对于您的愿望输出,您需要有两个查询。或者,您可以进行一次查询,然后使用前端脚本将结果转换为您想要的输出。
答案 1 :(得分:0)
这就是我使用UNION的意思。将需要一些操作来查看类型列并找出如何在下一层处理它。
SELECT
s.storeID,
s.storeName,
'Employee' AS type,
e.employeeID AS id,
e.employeeName AS name,
e.employeeSalary AS cost
FROM stores AS s
LEFT JOIN employees AS e ON e.fk_store_id = s.storeID
UNION
SELECT
s.storeID,
s.storeName,
'Product' AS type,
p.productID,
p.productName,
p.productPrice
FROM stores AS s
LEFT JOIN products AS p ON p.fk_store_id = s.storeID;
使用联接的单一查询是不可能的,因为产品和员工之间没有直接关系,因此您将加入商店,这将为您提供产品X员工加入。