左加入并属于
Posted
技术标签:
【中文标题】左加入并属于【英文标题】:Left join and belongs to 【发布时间】:2017-03-10 00:02:08 【问题描述】:我有三个表:products (id, name), categories (id, name) 和 products_categories (product_id, category_id)。
每个产品都属于一个或多个类别。
我想检索所有产品,并显示哪些产品已经在类别“X”中。 我的 div 是这样的:
<span>Category "X"</span>
[some php / fetch_assoc() / … ]
<div class="product">Product A</div>
<div class="product selected">Product B</div>
<div class="product">Product B</div>
目前,它使用两种查询:一种用于获取所有产品,另一种用于检查产品是否在 products_categories 中。所以第一个里面有很多带有 php 的小查询。
$getAllProducts = "SELECT products.name as productName, products.id as productID FROM products";
$resultProduct=$mysqli->query($getAllProducts);
while($product=$resultProduct->fetch_assoc())
$reqChecked = "SELECT * FROM products_categories
WHERE product_id=" . $product["productID"] ."
AND category_id=" . $category["id"]; //$category["id"] is given
$resultChecked = $mysqli->query($reqChecked);
$row = $resultChecked->fetch_row();
$selected = ""
if ( isset($row[0]) )
$selected = "selected";
可以只用一个查询吗?我尝试了 left join(产品上的 products_categories),但属于多个类别的产品被列出他们所在的每个类别。
编辑
这是一些示例数据
产品表
+----+-----------+
| id | name |
+----+-----------+
| 1 | product_1 |
| 2 | product_2 |
| 3 | product_3 |
+----+-----------+
分类表
+----+------------+
| id | name |
+----+------------+
| 1 | category_1 |
| 2 | category_2 |
| 3 | category_3 |
+----+------------+
加入表
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
+------------+-------------+
现在,假设我正在编辑 category_2 的页面,我想要以下结果:
+------------+--------------+-------------+
| product_id | product_name | category_id |
+------------+--------------+-------------+
| 1 | product_1 | 2 | --product_1 belongs to category_1 and category_2, but I only need it one time.
| 2 | product_2 | 2 |
| 3 | product_3 | NULL | --product_3 belongs to nothing but I want to see it.
+------------+--------------+-------------+
【问题讨论】:
您可以发布您现有的查询吗? 我刚刚添加了我的(丑陋的)查询。 【参考方案1】:这只是一个简单的连接问题。我最初认为您可能需要一些查询魔术来显示产品是否属于给定类别。但是,如果您只使用下面的查询,您可以检查 PHP 中每一行的类别名称并采取相应措施。
SELECT p.id,
p.name AS product,
c.name AS category -- check for value 'X' in your PHP code
FROM products p
INNER JOIN products_categories pc
ON p.id = pc.product_id
INNER JOIN categories c
ON c.id = pc.category_id
请注意,您当前的方法实际上是尝试在 PHP 代码本身中进行连接,这有很多原因是不可取的。
更新:
SELECT t1.id AS product_id,
t1.name AS product_name,
CASE WHEN t2.productSum > 0 THEN '2' ELSE 'NA' END AS category_id
FROM products t1
LEFT JOIN
(
SELECT product_id,
SUM(CASE WHEN category_id = 2 THEN 1 ELSE 0 END) AS productSum
FROM products_categories
GROUP BY product_id
) t2
ON t1.id = t2.product_id
【讨论】:
经过几次测试,它无法按我的意愿工作。如果产品不属于任何类别,则不会显示 - 使用 LEFT JOIN 而不是 INNER JOIN 解决。现在,如果产品属于两个类别, products 都会显示,我只想要一个。简而言之,我想要左边的所有产品,右边的一个方法来判断产品是否属于类别“X.id”。 @shlagwuk 请显示示例数据以便清楚。 我已将示例数据添加到我的第一篇文章中。 您的编辑不清楚。product_2
旁边有什么category_id
2?
因为product_1
和product_2
都属于category_2
。您的更新没问题,非常感谢!以上是关于左加入并属于的主要内容,如果未能解决你的问题,请参考以下文章
EF Core 3.1 (LINQ) - 如何在多列上左加入和分组