[英]mysql query from 2 tables with conditions
我有2张桌子
的OrderItems
+--------+------------+------------------+---------+ | item_id| item_name | Item_type | trans | +--------+------------+------------------+---------+ | 1 | Devon | line_item | 0 | | 2 | 100 | coupon | 0 | | 3 | Contin | line_item | 1 | +--------+------------+------------------+---------+
orderitems_data
1+--------+------------+------------------+-----------+ | id | item_id | Item_key | key_val | +--------+------------+------------------+------------+ | 1 | 1 | Delivery | 2015/04/03 | | 2 | 1 | attrib | pick_up | | 3 | 1 | qty | 1 | | 4 | 2 | discount | 0 | | 5 | 3 | Delivery | 2015/04/15 | | 5 | 3 | attrib | doorstep | +--------+------------+------------------+------------+
我需要从“订单项”中选择“ item_name”,其中“ Item_type = line_item”和“ trans = 0”,从“ orderitems_data”中选择“ key_val”,其中“ Item_key = Delivery”,然后选择“ key_val”,其中“ Item_key =属性”代表相同的“ item_name”
然后显示它们。 我在查询中苦苦挣扎,我想写
SELECT orderitems.item_name AS item_name WHERE orderitems.Item_type='line_item' AND trans=0, orderitems_data.key_val AS deliverydate WHERE Item_key='Delivery', orderitems_data.key_val AS location WHERE Item_key='attrib' FROM orderitems INNER JOIN order_items_data ON orderitems.item_id = orderitems_data.item_id
但显然这是不对的。
有人可以指出我正确的方向吗?
我想要得到的结果是
Devon pick_up 2015/04/03
这将帮助您-
SELECT orderitems.item_name AS item_name, orderitems_data.key_val AS deliverydate, orderitems_data.key_val AS location from orderitems left join orderitems_data
ON orderitems.item_id = orderitems_data.item_id
WHERE orderitems.Item_type='line_item' AND
orderitems.trans=0 and
( orderitems_data.Item_key='Delivery' or orderitems_data.Item_key='attrib')
SELECT oi.item_name, oid.key_val
FROM OrderItem oi, Orderitem_Data oid
WHERE oi.item_id = od.item_id
AND oi.item_type = 'line_item'
AND oid.item_key = 'Delivery'
最终没有得到你的要求
我想这会起作用
SELECT i.item_name, d.Item_key FROM orderitems i LEFT JOIN orderitems_data d on i.item_id =d.item_id WHERE i.Item_type='line_item' AND i.trans=0 AND d.Item_key in('attrib', 'Delivery');
这是从EAV数据集构造伪归一化数据透视表的基本答案:
SELECT i.*
, MAX(CASE WHEN d.item_key = 'attrib' THEN key_val END) attrib
, MAX(CASE WHEN d.item_key = 'Delivery' THEN key_val END) Delivery
, MAX(CASE WHEN d.item_key = 'qty' THEN key_val END) qty
, MAX(CASE WHEN d.item_key = 'discount' THEN key_val END) discount
FROM orderitems i
LEFT
JOIN orderitems_data d
ON d.item_id = i.item_id
GROUP
BY i.item_id;
+---------+-----------+-----------+-------+----------+------------+------+----------+
| item_id | item_name | Item_type | trans | attrib | Delivery | qty | discount |
+---------+-----------+-----------+-------+----------+------------+------+----------+
| 1 | Devon | line_item | 0 | pick_up | 2015/04/03 | 1 | NULL |
| 2 | 100 | coupon | 0 | NULL | NULL | NULL | 0 |
| 3 | Contin | line_item | 1 | doorstep | 2015/04/15 | NULL | NULL |
+---------+-----------+-----------+-------+----------+------------+------+----------+
请注意我之前有关orderitems_data表中id列的冗余以及在可能的情况下使用适当的数据类型的重要性的评论。
如果我没错,您想获取依赖于Item_type = 'line_item'
且trans = 0
和od.Item_key = 'Delivery' OR od.Item_key = 'attrib'
则使用以下查询
SELECT DISTINCT
o.*,
od.key_val,
od.Item_key
FROM
orderitems o
LEFT JOIN orderitems_data od
ON o.item_id = od.item_id
WHERE o.Item_type = 'line_item'
AND o.trans = 0
AND (od.Item_key = 'Delivery' OR od.Item_key = 'attrib')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.