php - mysql右连接查询不返回任何值

标签 php mysql

我正在尝试返回与所选品牌 ($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_idbrand 列,但我再次不确定该怎么做这个。

编辑尝试 #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/

相关文章:

php - 如果 GET 或 POST 为空,则重定向

php - 查询在 phpmyadmin 中有效,但在 PHP 脚本中无效

mysql - 为什么在简单的 UPDATE 上会发生 InnoDB 死锁?

java - NoClassDefFound错误: org/aspectj/lang/Sign

mysql - 不在子查询中的不同 ID 的计数?

php - 如果我无法从 mysql 检索值该怎么办

Python/MySQL - 通过 Tkinter 将数据插入表中

php - Laravel 您请求了 1 件商品,但只有 0 件可用

php - 根据用户选择对 MySQL 表行进行排序的最佳方法是什么?

php - foreach 列表项的逆序