-1

我有一个看起来像这样的数据库表:

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 会为我实现这一点,但它似乎不起作用。

4

2 回答 2

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
于 2013-05-20T20:41:53.823 回答
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
于 2013-05-20T20:43:07.047 回答