【问题标题】:Left Join combined with Where and On Clause MySQLLeft Join 结合 Where 和 On 子句 MySQL
【发布时间】:2021-09-29 13:54:49
【问题描述】:

我对 SQL/PHP 很陌生,我正在尝试将两个表左连接,第二个表左连接两次。 这里的场景: 我有两张表,products 和 productvariations。在 productvariations 表中,我还有一列“colorvalue”,它告诉用户它是产品的标准颜色还是特殊颜色。

产品

idproducts | product | checked
-------------------------------
1          | testpr1 | 0
2          | testpr2 | 0
...

产品变化

productid | colorvalue | price
-------------------------------
1         | 0          | 12.50
1         | 1          | 10.25
2         | 0          | 14.50
2         | 1          | 13.00
...

现在我要做的是选择产品的所有列,并在产品变量表的两倍中向它们左连接,以获得两个不同的附加列作为价格。但只有那些具有检查值 = '0' 的产品。 从不同的其他问答中我设置了这个代码,但不知何故它没有给我任何结果。有人可以帮忙吗?

SELECT products.*, productvar1.price_single, productvar1.price_palette, productvar2.price_single, productvar2.price_palette, productvar1.price_specialconditions, productvar1.price_colorchange 
FROM products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.product AND productvar1.colorvlaue = '0' 
LEFT JOIN productvariations AS productvar2 
ON products.idproducts = productvar2.product AND productvar2.colorvalue = '1'
WHERE products.checked = '0' LIMIT 200;

【问题讨论】:

  • 您在哪里没有收到任何结果?在 MySQL 服务器中运行代码(使用 phpmyadmin 等工具)或从 php 代码的前端运行代码?
  • 你的代码看起来不错。
  • 你可能不需要 2 个左连接,你可以简单地做 productvar1.colorvlaue in ('0', '1')
  • @FaNo_FN 抱歉,这是我的 php 代码的前端。将查询放入变量 $query 后,我检查 if ($result = mysqli_query($conn, $query)) 是否存在匹配项。但它总是自动转到 else 语句。
  • 可能是因为您的查询中的拼写错误?这 > AND productvar1.colorvlaue = '0'.. 它可能应该是 AND productvar1.colorvalue = '0' 因为如果我尝试这样做,您的查询似乎正在工作。看这里>db-fiddle.com/f/v3hB6Krrmwz88mhcdPi6i6/1

标签: mysql sql


【解决方案1】:

您的查询有一些拼写错误,当然 select 子句中有我在表中没有看到的列,但现在以下查询根据表中的信息工作。

SELECT products.*, 
       productvar1.colorvalue as colorvalue1,
       productvar1.price as price1,
       productvar2.colorvalue as colorvalue2,
       productvar2.price as price2
FROM PT1 products 
LEFT JOIN productvariations AS productvar1 
ON products.idproducts = productvar1.productid AND productvar1.colorvalue = '0' 
LEFT JOIN productvariations AS productvar2 
ON products.idproducts = productvar2.productid AND productvar2.colorvalue = '1'
WHERE products.checked = '0' LIMIT 200;

db<>fiddle中的演示

【讨论】:

  • 感谢您的回复。不过我遇到了另一个问题。使用第二个 LEFT JOIN。上面没有提到的是,在 productvariations 列表中,可以有多个匹配相同的产品和 colorvalue = '1'。现在它显示了所有匹配的行,但我只想要它的 MIN() 。找到这样的帖子stackoverflow.com/questions/11388443/… 但我无法理解如何应用它。你能帮忙吗?
  • 是的,我可以帮你投赞成票 :) 只需输入示例数据和所需的输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2021-02-15
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多