我正在尝试返回与所选品牌 ($brand) 共享“交易 ID”的前 10 个“品牌”。我从一个基本查询开始,该查询查询 1 个包含 id 和 Brand 列的表。
我现在想让它在 2 个单独的表(一个分别用于交易和产品)上运行,并具有公共(public)字段 (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
<> :brand 移至紧邻 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;
最佳答案
当 LEFT
/RIGHT
join 返回没有记录,首先检查是否 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)
关于php - mysql右连接查询不返回任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202135/