mysql假选择

时间:2009-06-02 01:03:53

标签: mysql select

我的目的是:从值列表中获取多行,如(1,2,3,4,5),('a','b','c','任何')等等。

mysql> select id from accounts where id in (1,2,3,4,5,6);
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  5 |
|  6 |
+----+
5 rows in set (0.00 sec)

上面的sql肯定没错,但我的问题是:有没有办法在没有

的情况下获得相同的结果

指定一个表?因为我的目的只是通过id_set传播行

另一个例子:

mysql> select now() as  column1;
+---------------------+
| column1             |
+---------------------+
| 2009-06-01 20:59:33 |
+---------------------+
1 row in set (0.00 sec)

mysql>

此示例传播了单行结果,但未指定表

但如何从字符串传播多行,如(1,2,3,4,5,6)?

6 个答案:

答案 0 :(得分:25)

这样的事情应该有效:

SELECT *
FROM (
    SELECT 0 as id
    UNION SELECT 1
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 4
    UNION SELECT 5
)

答案 1 :(得分:6)

MySQL有一个虚拟表:DUAL。但是使用DUAL不会改变任何东西(这只是为了方便),当然也不能使这个查询工作。

我确信有更好的方法可以实现您的目标。如果您解释问题,我们可能会提供帮助。

答案 2 :(得分:1)

这不能完全回答你的问题,但我相信这会解决你的实际问题..

SET @counter = 0;    SELECT(@counter:= @counter + 1作为计数器)...其余的查询

答案 3 :(得分:0)

我发现一种非常有价值的技术是an "integers table",它可以让你轻松地做各种各样的整洁事情,包括这个(xaprb写了几篇关于这种技术的博客文章和密切相关的“互斥表”)

答案 4 :(得分:0)

一种简单而老套的方法是使用一个包含连续值的表。

DROP TABLE IF EXISTS `range10`;
CREATE TABLE IF NOT EXISTS `range10` (
  `id` int(11) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM;
INSERT INTO `range10` (`id`) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

安装完成后,您可以编写如下所示的查询。

获取第二行:

select * from your_data_table where id in (
 SELECT id*2 as id FROM `range10` WHERE id in(
  select id from `range10`
 )
)

从1101到1111获取行:

select * from your_data_table where id in (
 SELECT id+1100 as id FROM `range10` WHERE id in(
  select id from `range10`
 )
)

因此,如果您需要更大的范围,那么只需增加表格范围10中连续值的大小。 查询很简单,成本低,无需存储过程或功能。

注意:

您也可以创建一个包含连续char值的表。但改变内容并不容易。

答案 5 :(得分:-1)

这是一种直接通过MySQL请求SELECT创建自定义行的方法:

SELECT ALL *
FROM (
    VALUES
        ROW ('1.1', '1.2', '1.3'),
        ROW ('2.1', '2.2', '2.3'),
        ROW ('3.1', '3.2', '3.3')
) AS dummy (c1, c2, c3)

给我们一张桌子dummy

c1   c2   c3
-------------
1.1  1.2  1.3
2.1  2.2  2.3
3.1  3.2  3.3