我有一个如下所示的db表:
product_tag_id | tag_id | product_id
1 1 1
2 1 2
3 3 1
我有一些在foreach循环中运行查询的php:
$product_tags = [1,3];
foreach(product_tags as $tag) {
$q = $this->db->query("SELECT product.*, product_tags.* FROM product
INNER JOIN product_tags ON product_tags.product_id = product.product_id
WHERE product_tags.tag_id =" . $tag);
}
使用1作为$ tag值的第一个查询将拉入product_id 1和2,使用3作为$ tag的第二个查询再次拉入product_id 1。
如果之前没有返回product_id,我只希望查询返回一行。如果product_id是唯一的,我只想查看结果。有没有办法做到这一点?
我认为DISTINCT会为我实现这一点,但它似乎不起作用。
答案 0 :(得分:1)
好的,您可能需要GROUP BY。我真的不确定以下内容实际上意味着什么,你可能会觉得表格中有某种日期列。
“如果之前没有返回product_id,我只希望查询返回一行。”
我将忽略这一点并假设您当前的数据如下,并且您无需担心其他列:
product_tag_id | tag_id | product_id 1 1 1 2 1 2 3 3 1
但你要归还:
product_tag_id | tag_id | product_id 1 1 1 3 3 1
即。你想要每个标签的最小PRODUCT_ID
。所以,你应该选择:
SELECT pt.product_tag_id, pt.tag_id, min(p.product_id) as product_id
FROM product
INNER JOIN product_tags pt
ON pt.product_id = p.product_id
WHERE pt.tag_id = ?
GROUP BY pt.product_tag_id, pt.tag_id
答案 1 :(得分:1)
在您的问题中加入DDL将始终为您提供更多更好的答案。
create table products (
product_id integer primary key,
product_name varchar(15) unique
);
create table product_tags (
product_tag_id integer primary key,
tag_id integer not null,
product_id integer not null,
unique (tag_id, product_id)
);
insert into products values (1, 'a'), (2, 'b'), (3, 'c');
insert into product_tags values (1, 1, 1), (2, 1, 2), (3, 3, 1);
如果之前没有返回product_id,我只希望查询返回一行。
另一种(也是更有用的)说法是“我希望每个product_id有一行”。我们要问的是,“当每个产品有多个tag_id时,你想要哪个tag_id?”在这里,我返回最小的tag_id。
select products.product_id, products.product_name, tags.min_tag_id
from products
inner join
(select product_id, min(tag_id) min_tag_id
from product_tags
group by product_id) tags
on tags.product_id = products.product_id
where tags.min_tag_id = 1