繁体   English   中英

MySQL查询从2个表的条件

[英]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 = 0od.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM