【问题标题】:SQL JOIN query syntaxSQL JOIN 查询语法
【发布时间】:2012-07-29 07:29:46
【问题描述】:

我有一张存储购买的桌子,还有一张存储产品的桌子。

purchases 表中的每一行最多可以包含 9 个产品 ID(8 个可以为空)

id, foo, bar, baz, product_1_id, product_2_id, product_3_id, etc... 

现在我需要查询该 purchases 表的所有字段,以显示在 html 页面中。

我不能只显示products id,所以需要在products表中找到对应的product_name。

SQL 查询让我很难受。

任何帮助将不胜感激。

【问题讨论】:

  • 您不应该只有一个产品表,而不是限制购买九个产品吗?
  • 能否重新设计数据库以使用连接表?
  • “购买表中的每一行最多可以包含 9 个产品 ID(8 个可以为空)”。通常,这将存储在单独的表“purchase_item”或“purchase_product”中。我想“购买”并不是一个好名字,因为它指的是一个单独的项目。经典名称是“purchase_order”和“purchase_order_item”或“purchase_order_line”。您的设计的问题在于它不灵活(每次购买最多 9 个产品)并且很难查询。每次购买时,您都需要加入每个潜在产品。使用单独的 purchase_order_item 表,您只需要一个。
  • 我想知道当他/她将第 10 个产品添加到订单中时,您会向用户发送什么消息。 “抱歉,我们只想卖给你9件?” :)
  • 你的cmets是对的,我必须承认。但是,如果有人想一次购买十种产品,我很乐意从头开始重新考虑一切,免费......;)

标签: mysql sql


【解决方案1】:

要检索产品名称,我会试试这个:

SELECT t2.product_name as product_name_1, t3.product_name as product_name_2, t4.product_name as product_name_1, [...]
FROM purchases as t1
JOIN products as t2 ON(t1.product_1_id = t2.product_id)
LEFT JOIN products as t3 ON(t1.product_2_id = t3.product_id)
LEFT JOIN products as t4 ON(t1.product_3_id = t4.product_id)
[...]
WHERE t1.id = ...

但这可能会很慢,您可能需要重组您的数据库。

【讨论】:

    【解决方案2】:

    您需要加入 Products 表 9 次。但考虑归一化

    select id, foo, bar, baz, p1.product_name, p2.product_name, p3.product_name, 
      etc...  
    from purchases as pur
    left join products as p1 on pur.product_1_id=p1.product_id
    left join products as p2 on pur.product_2_id=p2.product_id
    .
    .
    

    【讨论】:

      【解决方案3】:

      在sql中你可以这样使用..

       select *,PM.Product_id,P.Product_name from purchase_mst PM, product P where   
       PM.Product_id1=P.Product_id1 and PM.Product_id2=P.Product_id2 etc....
      

      【讨论】:

        【解决方案4】:

        通过适当的规范化设计,您将拥有:product、purchase_Order 和 purchase_order_line,查询将是:

        SELECT     ...
        FROM       purchase_order
        INNER JOIN purchase_order_line
        ON         purchase_order.id = purchase_order_line.purchase_order_id
        INNER JOIN product
        ON         purchase_order_line.product_id = product.id
        

        【讨论】:

        【解决方案5】:

        我认为,如果您有一个将 purchasesproducts 与两列 *product_id、purchase_id* 连接起来的表格会更容易。

        不过,我想你可以试试这样的:

        SELECT pr1.name
         FROM purchases pur1, products pr1
        WHERE pur1.product_1_id = pr1.id
        UNION ALL
        SELECT pr2.name
         FROM purchases pur2, products pr2
        WHERE pur2.product_1_id = pr2.id
        UNION ALL
        -- and so on until
        SELECT pr9.name
         FROM purchases pur9, products pr9
        WHERE pur9.product_9_id = pr9.id
        

        虽然这看起来很吓人,但我强烈建议重新考虑您的数据库设计。

        【讨论】:

          【解决方案6】:

          你可以这样做

          选择购买。,产品。从购买加入产品 id1=id, id2=id...等。

          阅读:

          MySQL how to join tables on two fields

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-03
            • 2013-03-14
            • 1970-01-01
            • 2015-07-18
            • 2017-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多