更好的方法来重复查询而不是UNION ALL?

时间:2015-10-28 22:47:32

标签: mysql

我正在尝试创建一个多次输出特定行的查询。让我们说输出一行6次。我已经检查了与此相关的其他问题,但没有得到任何最能回答我问题的问题。
这是我的疑问。

SELECT * FROM table WHERE id=1
UNION ALL
SELECT * FROM table WHERE id=1
UNION ALL
SELECT * FROM table WHERE id=1
UNION ALL
SELECT * FROM table WHERE id=1
UNION ALL
SELECT * FROM table WHERE id=1
UNION ALL
SELECT * FROM table WHERE id=1

此方法适用于少量重复。现在我的问题是,是否有更好的(或标准的)方法,这也适用于大量重复?

如果之前已经回答过这个问题,请放弃链接,然后我就试一试。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是,无论您想要拥有多少行,您都可以创建一个您选择的数字表,并按您的ID加入+您想要重复的行数。像这样

SELECT e.* 
FROM example e
JOIN
(   SELECT
        seq.s as digit
    FROM
    (   SELECT (hundreds.s + tens.s + ones.s) s
        FROM(SELECT 0  s UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ones
        CROSS JOIN(SELECT 0 s UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) tens
        CROSS JOIN(SELECT 0 s UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900) hundreds
    ) seq
) n ON e.id + 5 > n.digit
WHERE e.id = 1

<强> FIDDLE

我发布的(在评论中)上一个sql小提琴的问题是你必须在表格中有足够的记录来提取准确的重复记录..这样你每次都会得到你想要的东西< /强>

注意:所有意图和目的都是一个例子。我会高度建议您不要一直运行此查询。如果你真的需要一个数字表,那么创建一个并插入这些值一次。然后加入表格。

如果你必须走这条路(在mysql中复制记录)那么这就是我要做的事情

CREATE TABLE digits (id INT);
INSERT INTO digits (id)
SELECT
    seq.s as digit
FROM
(   SELECT (hundreds.s + tens.s + ones.s) s
    FROM(SELECT 0  s UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ones
    CROSS JOIN(SELECT 0 s UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) tens
    CROSS JOIN(SELECT 0 s UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900) hundreds
) seq

现在你有一个数字表加入它

SELECT e.* 
FROM example e
JOIN digits d ON e.id + 5 < d.id
WHERE e.id = 1

答案 1 :(得分:1)

一次性创建一个包含1-n数字的表格,然后用它来“生成”数字范围并加入到该范围内。

这是创建和填充表格的简单方法:

    ...
} position1 = {.x = 60, .y = 0}, 
  position2 = {.x = 60, .y = 120};

此代码使用数字1-1024填充表格。 create table numbers (number int not null primary key auto_increment); insert into numbers () values (); insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; insert into numbers select null from numbers; 的每次额外执行都会使行数加倍。

现在加入,说100次:

insert into numbers select null from numbers

您当然可以将select table.* from table join numbers on number <= 100 where id = 1 值参数化为查询参数,这意味着您可以在运行时查询所需的行数。

因为mysql不支持生成的序列,所以100表可以非常方便地生成日期范围和所有类型的值。