【问题标题】:mysql query from 2 tables with conditions来自2个带有条件的表的mysql查询
【发布时间】:2015-04-29 12:25:48
【问题描述】:

我有两张桌子

订购商品

+--------+------------+------------------+---------+ | 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 | +--------+------------+------------------+------------+

我需要从“orderitems”中选择“item_name”,其中“Item_type = line_item”和“trans=0”,从“orderitems_data”中选择“key_val”,其中“Item_key = Delivery”,以及“key_val”,其中'Item_key=attribute' 用于相同的 '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

【问题讨论】:

  • 能否给出create table命令,我们可以试试。
  • 请注意,您的 orderitems_data 表中的 id 是多余的。此外,在使用此类 EAV 模型时,请尽量确保您仍然尊重数据类型。
  • 能否提供您想要的结果。
  • 这都是很好的信息,谢谢@Strawberry 我没有设计数据库,但我会看看你的 cmets。我正在寻找的结果是选择 Devon pick_up 2015/04/03 再次感谢
  • 请用任何其他信息更新您的问题。

标签: php mysql mysqli


【解决方案1】:

这会对你有所帮助 -

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')

【讨论】:

    【解决方案2】:
    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'
    

    最后没明白你的意思

    【讨论】:

      【解决方案3】:

      我想这会奏效

      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');
      

      【讨论】:

        【解决方案4】:

        这是从 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 列的冗余以及尽可能使用正确数据类型的重要性的 cmets。

        【讨论】:

          【解决方案5】:

          如果,我没有错,你想获得依赖于 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')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-22
            • 1970-01-01
            • 1970-01-01
            • 2016-02-12
            • 2018-04-18
            相关资源
            最近更新 更多