SQL - 使用子查询返回多个行

时间:2012-10-04 13:45:28

标签: sql join subquery

我无法理解这一点,所以我需要一些建议。

我有许多产品,我使用单独的表分配了一些关键字。我想迭代这些关键字并生成包含相同关键字的其他产品的列表......所以在下面的示例中,我有一个ID为149的产品,其中分配了两个关键字,但是我的SQL只会使用一个关键字处理产品。

所以我无法理解的是我如何利用这两个关键词制作产品清单。任何帮助都会很棒。

SQL: -

 $products_id = $_GET['products_id'];
 $slideQuery = mysql_query("

 select p.products_id, p.products_image, p.products_price, 
 pd.products_name, k2p.key_key_id  

 from products p

 join products_description pd on 
 pd.products_id = p.products_id 

 join products_keyword_to_product k2p on 
 k2p.products_id = p.products_id 

 where k2p.key_key_id = (
      select key_key_id  
  from
  products_keyword_to_product
  where 
  products_id=" . $products_id ."
      )  

  group by p.products_id 
  order by p.products_price desc 
  limit 12

编辑添加:我之前通过使用php while循环并在此循环中查询数据库实现了这一点,但我确信必须有更好的方法来实现这一点。

更新:我查看了从这个问题中收到的建议,但我的查询无法完成。此时它有点超出我的“工资等级”所以我选择创建一个链接,将相关的ID传递到URL字符串并重新加载页面,随着网站的增长,可能会成为更好的选择。 我认为这里学到的教训是退出你想要实现的目标,并确保你做到这一点的方式是实现它的最好方法。

2 个答案:

答案 0 :(得分:1)

你想用GROUP BY和HAVING做这件事。

select p.products_id,
    p.products_image,
    p.products_price,
    pd.products_name,
    k2p.key_key_id
from products p
inner join (
    select products_id
    from products_keyword_to_product
    where key_key_id in (
        select key_key_id
        from products_keyword_to_product
        where products_id = " . $products_id ."
    )
    group by products_id
    having count(distinct key_key_id) = (
        select count(distinct key_key_id)
        from products_keyword_to_product
        where products_id = " . $products_id ."
    )
) pm on p.products_id = pm.products_id
inner join products_keyword_to_product k2p on k2p.products_id = p.products_id
inner join products_description pd on pd.products_id = p.products_id
order by p.products_price desc 
limit 12

答案 1 :(得分:1)

尝试使用IN代替=

即:

 ....
 where k2p.key_key_id IN ( 
 ....