2011-03-17 73 views
2

我有mysql-表称为产品具有以下结构/内容:MySQL的优化

id (int), public_id (int), deleted (bool), online (bool) 
1   1    0    1 
2   1    0    0 
3   1    1    0 
4   2    0    1 
5   2    0    1 

我的问题是,如何选择全部,当前在线,不删除产品。在这个例子中只记录5(public_id 2)。相同的public_id表示相同的产品(分组)。id越高,信息越新(排序)。并且产品需要而不是已删除(其中)。还有一些其他地方的声明,在这种情况下与在线领域。

我需要所有方面(分组,排序和地方),但我不知道如何。

有什么建议吗?的

结果从Galz解释查询:

id select_type   table   type possible_keys key  key_len ref rows Extra 
1 PRIMARY    nomis_houses ref online   online 1  const 8086 Using where 
2 DEPENDENT SUBQUERY nomis_houses index NULL   house_id 4  NULL 9570 Using filesort 

PS。此查询的伎俩,但非常,非常,非常缓慢:

select * from 
(select * from 
    (select * from products order by id desc) tmp_products_1 
group by public_id) tmp_products_2 
where deleted = '0' AND online = '1' 

回答

2

基于萨钦的答案,你的评论,也许这可以帮助:

select * from products where id in 
(
    select max(id) as id from products 
    where sum(deleted) = 0 
    group by public_id 
) 
and online = 1 

编辑由Pentium10

查询可以改写成

SELECT * 
FROM products p 
     JOIN (SELECT MAX(id) AS id 
      FROM products 
      HAVING SUM(deleted) = 0 
      GROUP BY public_id) d 
     ON d.id = p.id 
WHERE online = 1 

你需要的索引:

  • (ID,在线)
  • (public_id,删除,ID)
+0

内部查询中不允许使用“max(id)”。内部查询应该只返回一列。 – Tim 2011-03-17 17:36:38

+0

@Tim - 已更正,现在尝试 – Galz 2011-03-17 17:49:03

+0

@Galz - 结果正确,但速度太慢,无法使用。 MySQL已经忙了几分钟。 – Tim 2011-03-17 17:59:19

0
select * from products where public_id in 
(
    select public_id from products  
    group by public_id 
    having sum(deleted) = 0 
) 
and online = 1 

尝试,如果能正常工作。子查询会提供所有未被删除的public_id,然后运行其他联机的筛选器。

+2

应该是'由具有public_id总和组(删除)=的0'代替其中+组由 – 2011-03-17 17:21:44

+0

这两种解决方案是不够的。我编辑了这个例子,我添加了另一个记录,同样用public_id 2。应该选择第五行(最新版本的public_id 2)而不是第四行。 – Tim 2011-03-17 17:28:49

+0

@Simen - 谢谢。根据您的评论编辑我的答案。 – 2011-03-17 18:13:05

0

嗯,这工作,但我不知道它的效率。基于萨钦的回答

select p.* from products p where p.public_id in 
(
    select p2.public_id from products p2 
    group by p2.public_id 
    having sum(p2.deleted) = 0 
) 
and p.online = 1 
and p.id = (select max(p3.id) from products p3 where p3.public_id = p.public_id); 
+0

确实有效,但它速度很慢:-)我在一分钟前开始了这个查询,并且在我们发言时它仍在运行。没有办法消除WHERE子句中的查询,因为这些显然是瓶颈?也许我应该考虑对表结构采用不同的方法? 3分钟,并计数。 – Tim 2011-03-17 17:45:30