【问题标题】:join values of 2 tables and display data连接2个表的值并显示数据
【发布时间】:2015-10-19 22:56:07
【问题描述】:

我有 2 张桌子、购物车和产品。用户可以从产品表中选择产品,然后将其详细信息添加到购物车表中。我想要一个结合这两个表的值并给出结果的列表

产品尺寸

id   catid   catname  productid   prodsize     cost    prodname
1     2      CN1        13          small      130     P1
2     2      CN1        13          large      200     P1
3     2      CN1        14          small      50      P2
4     2      CN1        14          medium     90      P2
5     2      CN1        14          large      110     P2
6     2      CN1        12          small      70      P3
7     2      CN1        12          medium     110     P3
8     2      CN1        13          medium     200     P1

购物车

id   catid  catname  userid  productid   prodname  prodsize   prodcost  quantity    status 
1     2        CN1      1       13          P1       small      130       2       add_to_cart 
1     2        CN1      1       13          P1       large      200       2       order_placed  

当我从两个表中运行以下查询组合值时,但在这里我希望只显示状态为 add_to_cart 的那些产品数量,如果状态为 order_placed 则数量应为 0,谁能告诉我如何我修改以下代码以获得所需的结果

$sql= "SELECT p.catid, p.catname, p.productid, p.prodimg, GROUP_CONCAT(p.prodsize ORDER BY p.id ASC) as size, GROUP_CONCAT(p.cost ORDER BY p.id ASC) as cost, p.prodname,
   GROUP_CONCAT(c.prodsize,'-',c.quantity) as cart_details, GROUP_CONCAT(DISTINCT(c.userid)) as user_id
   FROM productsize p
   LEFT JOIN cart c ON(c.productid = p.productid AND c.userid = '$userid' AND p.prodsize = c.prodsize)
   WHERE p.catid ='$catid' 
   GROUP BY p.productid
   ORDER BY user_id DESC, p.productid ASC";

【问题讨论】:

  • 在查询中添加where 子句。
  • @Gordon Linoff 我试过了,但它不起作用
  • 仔细阅读,我认为您需要一个案例表达式来处理您的输出中的一些条件逻辑。

标签: mysql sql database


【解决方案1】:

我对您的两个条件有些困惑(“已订购”商品不应显示,数量应为 0)。如果它们的数量为 0,则需要显示它们,对吗?无论如何,考虑到您可能想要执行后者(在查询结果中获取数量为 0 的“已订购”项目),这是我的解决方案

  1. 您需要按productid AND status 分组
  2. 您需要一个数量作为将状态考虑在内的总和

还清理了一些其他的东西(例如引用的索引,这会损害性能):

$sql = "SELECT p.catid, p.catname, p.productid, p.prodimg, 
            GROUP_CONCAT(p.prodsize ORDER BY p.id ASC) as size, 
            GROUP_CONCAT(p.cost ORDER BY p.id ASC) as cost, p.prodname,
            GROUP_CONCAT(c.prodsize,'-',c.quantity) as cart_details, 
            GROUP_CONCAT(DISTINCT(c.userid)) as user_id,
            SUM(CASE WHEN c.status = 'add_to_cart' THEN quantity ELSE 0 END) AS quantity
        FROM productsize p
        LEFT JOIN cart c ON(c.productid = p.productid 
            AND p.prodsize = c.prodsize)
            AND c.userid = {$userid}
        WHERE p.catid = {$catid}
        GROUP BY p.productid, c.status
        ORDER BY p.productid ASC";

【讨论】:

  • 在不破坏左连接的情况下,不能在 where 子句中对 userid 进行过滤。
【解决方案2】:

你已经有了 where 子句。尝试添加

AND status = 'add_to_cart'

就在现有的 where 子句之后。

【讨论】:

    【解决方案3】:

    c.quantity 更改为:

    case c.status
        when 'add_to_cart' then c.quantity
        else 0
    end
    

    由于您使用了左连接,因此当该产品未出现在用户的购物车中时,零结果也将适用。

    请注意,userid 上的排序可能有效地订购了购物车和非购物车产品,但这是表达这种意图的错误方式。最好在各处聚合非组列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多