php merge查询left join和if else语句

时间:2018-01-07 01:15:13

标签: php mysql sql

我尝试进行查询以获取有关 productID,numOfLikes,isLiked的信息。

问题是我无法计算如何将第一个查询与第二个查询合并。

  1. 第一个查询在一组数字上运行,并从数据库中返回产品的 productID,numOfLikes

    $result = $connection->query("SELECT productID, numOfLikes 
                                  FROM Products 
                                  WHERE productID IN (".implode(", ", array_map('intval', $arr)));
    
  2. 第二个查询检查 productID customerID 的匹配项是否存在于 CustomerProduct 表中的同一行。

    "SELECT customerID, productID 
    FROM CustomerProducts 
    WHERE productID = ".$productID." AND customerID = ".$customerID;
    
  3. 我想知道如果找到匹配项,如何使第二个查询返回true。

    我添加了一个数据库架构,如果这可能会有所帮助。

    DB Schema

    编辑:
    发送到php页面的数据如下所示:
    { customerId 107678695429 ,gArrayOfProductIds:[{productId:52979957765},{productId:69128650757},{productId:69757075461},{productId:69833654277}}}

    示例:

    首先查询:
    enter image description here

    CustomerProducts表,其中包含从数据中提供的productIds:
    enter image description here

    合并后查询:
    enter image description here

    正如您所见,customerId:107678695429赞了3个产品,但并不喜欢第4个产品,很多人都喜欢这个产品。

    非常感谢可能提供帮助的人。

    答案:

    我结合了 rolfv1 Susang 的答案。

    查询:

    SELECT p.productID, p.numOfLikes, CASE WHEN cp.customerID IS NULL THEN 'false' ELSE 'true' END isLiked FROM Products p LEFT JOIN CustomerProducts cp ON cp.productID = p.productID AND cp.customerID = 107678695429 WHERE p.productID IN (52979957765,69833654277,69757075461,69128650757)
    

    PHP查询:

    $result = $connection->query("SELECT p.productID, p.numOfLikes,CASE WHEN cp.customerID IS NULL THEN 'false' ELSE 'true' END isLiked FROM Products p LEFT JOIN CustomerProducts cp ON cp.productID = p.productID AND cp.customerID = ".$customerID." WHERE p.productID IN (".implode(", ", array_map('intval', $arr)).")");  
    

    非常感谢rolfv1和Susang

2 个答案:

答案 0 :(得分:1)

假设两个表中的productID相同,您可以使用此查询:

$result = $connection->query("SELECT p.productID, p.numOfLikes, cp.customerID FROM Products p LEFT JOIN CustomerProducts cp ON cp.productID = p.productID WHERE p.productID IN (".implode(", ", array_map('intval', $arr)).")");

编辑: 如果找到客户是否显示真/假,请使用

之类的内容
$result = $connection->query("SELECT p.productID, p.numOfLikes, cp.customerID, CASE WHEN cp.customerID IS NULL THEN 'false' ELSE 'true' END customerFound FROM Products p LEFT JOIN CustomerProducts cp ON cp.productID = p.productID WHERE p.productID IN (".implode(", ", array_map('intval', $arr)).")");

(另请注意在查询末尾添加的括号以关闭IN ()。)

(请注意,我假设您在使用之前清理了查询的输入变量)

答案 1 :(得分:0)

试试这个:如果我对您的要求是对的,那么您可以使用LEFT JOINCASE

获得所需的输出
SELECT CASE WHEN cp.productID IS NULL THEN 0 ELSE 1 END AS TrueFalse 
FROM products p
LEFT JOIN CustomerProducts cp ON cp.productID = p.productID
    AND cp.productID = 5 AND cp.customerID = 6