我正在尝试回归与所选品牌($品牌)共享“交易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_id
和brand
列,但我再也不确定如何执行此操作。
编辑尝试#2 - 根据以下建议,我移动了AND 2_products
。brand
&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;
答案 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上的以下问题中解决了