2013-08-16 58 views
0

我想找到一个MySQL要求3个的某些行,可以说,例如行5,第10和15找到3个某些行

我知道我可以做3单要求与

SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 4,1 
SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 9,1 
SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 14,1 

但是不是有一个更简单的方法来做到这一点,并把一切都变成一个查询?

+0

你可以'联合'他们togehter或确保值='值'只显示5,10,15我不知道上下文,所以这可能不是一个选项 –

+1

你可能要小心,因为MySQL不保证没有ORDER BY条款的响应中数据的顺序。 – msturdy

回答

0

尝试UNION ALL:在MySQL

SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 4,1) as tmp1 
UNION ALL 
SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 9,1) as tmp2 
UNION ALL 
SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 14,1) as tmp3 
+0

当表格可能有重复时,请勿使用UNION –

+0

当表格可能有重复时,请勿使用UNION ALL请参阅http://sqlfiddle.com/#!2/6bbb1/1我可以得到一个结果。 –

+0

OP需要3行出现在第5,10和15位,因此可以说,如果第5行与第10和第15行相同。所以结果集将有3行完全相同,我认为这是OP所需要的 –

2

行并没有排序,这意味着,他们可以在任何顺序返回。因此,您提出的使用LIMIT的解决方案将无法永久工作。请添加一个ID属性并像下面一样查询您的日期。

SELECT * FROM `table` 
WHERE `value` = '$value' 
    AND `ID` in (5, 10, 15) 
+0

OP需要第5条第10条和第15条记录,这怎么可能适用于所有情况 –

+1

如果表中有AUTO_INCREMENT ID如果删除引起的iD增量没有间隔,这也是可能的。 –

0

根据它们的位置引用行几乎不是一个好主意。使用主键。如果你没有主键 - 添加一个。

如果你是绝对确信你真的需要通过自己的位置引用行,你可以使用UNION(如Sashi康德的答案),或者你可以给他们序列号和过滤对他们这样的:

SELECT * 
FROM (SELECT 
    @[email protected]+1 as i, 
    t.* 
    FROM `table` t 
    JOIN (SELECT @i:=0) #0 will make the row index 1-based, if you need 0-based you can change it to -1 
    WHERE `value` = '$value' 
    ORDER BY <something> 
    LIMIT 15 #the max row num you want 
) as t 
WHERE t.i IN (5,10,15) 
+0

注意:如果您使用INNODB作为存储引擎,则应始终在表中添加PRIMARY KEY或UNIQUE KEY。我写了一篇关于dba stackoverflow的文章http://dba.stackexchange.com/questions/48072/why-does-mysql-ignore-the-index-even-on-force-for-this-order-by/48184 #48184 –