2015-10-17 24 views
1

我有2个表格,购物车和产品。用户可以从产品表中选择产品,然后将其详细信息添加到购物车表中。我想结合这两个表的值,并给出了结果连接2个表格和显示数据的值

prodsize的列表

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,谁能告诉PLZ我如何修改下面的代码,从而获得所需结果

$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"; 
+1

为你的查询添加一个where子句。 –

+0

@Gordon Linoff我已经试过了,但它不是干活 – pp1989

+0

读一点点接近,我认为你需要一个CASE表达式来处理一些有条件的逻辑IB您的输出。 – shawnt00

回答

0

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

AND status = 'add_to_cart' 

就在现有的where子句之后。

1

我对你的两个条件有点糊涂了(“命令”项不应该得到显示和数量应为0)。如果他们的数量为0,他们需要显示,对吗?总之,这里是我的修补程序考虑到您可能需要做后者(得到“有序”在您的查询结果项为0的量)

  1. 你需要按productidstatus
  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"; 
+1

userid上的过滤器不能在where子句中发生,而不会破坏左连接。 – shawnt00

+0

@ shawnt00 - 好点,我错过了。更新。谢谢。 –

0

更改c.quantity到:

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

既然你用左连接,零结果也将在该产品在用户的购物车并没有出现申请。

并注意userid排序可以有效订购车和非车产品,但就是表达这种意图的错误的方式。最好在各处汇总非组列。

相关问题