mysql右连接查询返回没有值

时间:2015-12-10 12:39:35

标签: php mysql

我正在尝试回归与所选品牌($品牌)共享“交易ID”的前10个“品牌”。我从一个基本查询开始,该查询使用列id和品牌查询1个表。

我现在想要在2个单独的表(分别用于交易和产品)上使用公共字段(sku)。

我从这个查询开始,获取初始逻辑(信用到stackoverflow贡献者),它完美地工作。

$brand = $_POST['brand'];
$query = $db->prepare("SELECT brand
FROM transactions
WHERE
id IN (SELECT id FROM transactions WHERE brand = :brand)
AND brand <> :brand
GROUP BY brand
ORDER BY COUNT(*) DESC
LIMIT 10");
$query->bindparam(":brand", $brand);
$query->execute();

如上所述,上述工作非常有用。我在下面略微修改它以包含相关表格。但是,它不起作用。并且不返回任何值。

任何接受者。非常感谢 - 亚当

$brand = $_POST['brand'];
$query = $db->prepare("SELECT `2_products`.`brand` 
FROM `2_products` 
RIGHT JOIN `1_txns` 
ON `2_products`.`sku`=`1_txns`.`sku` 
WHERE 
`1_txns`.`txn_id` IN (SELECT `1_txns`.`txn_id` FROM `1_txns` WHERE `2_products`.`brand` = :brand) 
AND `2_products`.`brand` <> :brand 
GROUP BY `2_products`.`brand` 
ORDER BY COUNT(*) DESC 
LIMIT 10");
$query->bindparam(":brand", $brand);
$query->execute();

我知道可能还有其他方法,例如创建临时表,只有txn_idbrand列,但我再也不确定如何执行此操作。

编辑尝试#2 - 根据以下建议,我移动了AND 2_productsbrand&lt;&gt; :品牌立即在ON条款之后。仍然有0行返回。

    $brand = $_POST['brand'];
$query = $db->prepare("SELECT `2_products`.`brand` 
FROM `2_products` 
RIGHT JOIN `1_txns` 
ON `2_products`.`sku`=`1_txns`.`sku` 
AND `2_products`.`brand` <> :brand
WHERE `1_txns`.`txn_id` IN (SELECT `1_txns`.`txn_id` FROM `1_txns` WHERE `2_products`.`brand` = :brand) 
GROUP BY `2_products`.`brand` 
ORDER BY COUNT(*) DESC 
LIMIT 10");
$query->bindparam(":brand", $brand);
$query->execute();

编辑3:还考虑到在我的内部选择查询中,where子句是一个未从内部查询中选择的列的事实。所以我试过这个:我得到一个错误'操作数应该只包含1列'

    SELECT `2_products`.`brand` 
FROM `2_products` 
RIGHT JOIN `1_txns` 
ON `2_products`.`sku`=`1_txns`.`sku` 
AND `2_products`.`brand` <> :brand 
WHERE `1_txns`.`txn_id` IN (SELECT `1_txns`.`txn_id`, `2_products`.`brand` 
                            FROM `1_txns` 
                            LEFT JOIN `2_products` 
                            ON `1_txns`.`sku`=`2_products`.`sku` 
                            WHERE `2_products`.`brand` = :brand) 
GROUP BY `2_products`.`brand` 
ORDER BY COUNT(*) DESC 
LIMIT 10;

2 个答案:

答案 0 :(得分:0)

LEFT / RIGHT联接没有返回记录时,首先检查WHERE是否有任何过滤器引用“弱”侧的表。 “弱”一面是指LEFT JOIN上的右表,或RIGHT JOIN上的左表。

在您的情况下,左表是2_products,因此它可能会生成NULL字段,但在WHERE中您有2_products.brand <> :brand。如果此条件失败,则将删除记录。

为了避免这种情况,请尝试在2_products.sku=1_txns.sku之后将此条件移动到ON子句,因为如果条件失败,那么过滤将不会删除记录。它看起来应该是这样的:

ON 2_products.sku=1_txns.sku AND 2_products.brand <> :brand

WHERE子句应如下所示:

WHERE 1_txns.txn_id IN (SELECT 1_txns.txn_id FROM 1_txns WHERE 2_products.brand = :brand)

答案 1 :(得分:0)

这在dba.stackexchange上的以下问题中解决了

DBA Question