sqlite 选择1到n的关系“错误的方式左右”

rkue9o1l  于 2023-06-30  发布在  SQLite
关注(0)|答案(2)|浏览(100)

products
| 价格| price |
| --| ------------ |
| 十个| 10 |
| 二十个| 20 |
orders
| 地址| address |
| --| ------------ |
| 拉拉| lala |
| 拉拉| lala |
orderedProducts
| orderId|金额| amount |
| --|--| ------------ |
| 0| 1| 1 |
| 0| 2| 2 |
| 1| 2| 2 |
我想得到:

orders[
   {id, address, items[{productid , price, amount}, {productid , price, amount}]},
   {id, address, items[{productid , price, amount}]}
]

这可能通过单个查询实现吗?我正在使用Python的SQLite。

rwqw0loc

rwqw0loc1#

您可以使用json_group_arrayjson_object。使用文档为here
您的查询可能是这样的:

SELECT
  o.id AS order_id,
  o.address,
  json_group_array(
    json_object(
      'productid', p.id,
      'price', p.price,
      'amount', op.amount
    )
  ) AS items
FROM
  orders o
LEFT JOIN
  orderedProducts op ON o.id = op.orderId
LEFT JOIN
  products p ON op.productid = p.id
GROUP BY
  o.id, o.address;

您必须使用GROUP BY o.id, o.address,因为json_group_array
为了使一些演示查询感觉自由使用这个site
模拟数据创建:

CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  price INTEGER
);

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  address VARCHAR(100)
);

CREATE TABLE orderedProducts (
  productid INTEGER REFERENCES products(id),
  orderId INTEGER REFERENCES orders(id),
  amount INTEGER
);

INSERT INTO products (id, price) VALUES (0, 10), (1, 20);
INSERT INTO orders (id, address) VALUES (0, 'lala'), (1, 'lala');
INSERT INTO orderedProducts (productid, orderId, amount) VALUES (0, 0, 1), (1, 0, 2), (1, 1, 2);
aamkag61

aamkag612#

你可以使用GROUP_CONCAT,类似这样:

SELECT   
  o.orderId,   
  o.address,  
  '[' || GROUP_CONCAT('{"id": ' || p.productid || ', "price": ' || p.price || ', "amount": ' || op.amount || '}', ', ') || ']' as items  
FROM orders o  
JOIN orderedProducts op ON o.orderId = op.orderId  
JOIN products p ON op.productid = p.productid  
GROUP BY o.orderId, o.address;

下面是一个SQL Fiddle示例

相关问题