我的目的是:从值列表中获取多行,如(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)?
答案 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