如果结果是唯一的,则仅返回一行

时间:2013-05-20 19:58:14

标签: php sql

我有一个如下所示的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会为我实现这一点,但它似乎不起作用。

2 个答案:

答案 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