如果QTY> MySQL输出多行1

时间:2011-05-08 03:30:58

标签: mysql sql

如果表中的某个字段大于1,是否有任何方法可以输出多个表行。

这是我的例子:

我正在建立一个拍卖网站,我们在那里出售抽奖券。 票证存储在如下表格中:

id, order_id, product_id, qty, price

当打印票证时,我想将所有票据转储成CSV格式。 到目前为止,我正在进行此查询(简化,省略INNER JOIN):

SELECT id, order_id, product_id, qty, price FROM order_details

然后运行类似下面的循环:

foreach($rows as $row) {
   for($i = 0; $i < $row['qty']; $i++) {
      $tickets[] = $row;
   }
}

这样我就可以获得每个数量的单独条目(以便人们获得正确数量的条目......)。

有没有办法在SQL本身实现这一点,所以每行乘以x次,其中x是表中的某个字段(本例中为qty)?

6 个答案:

答案 0 :(得分:2)

您可以使用blackhole表和trigger

在MySQL中完全实现此目的

设置表格
首先创建你要插入的黑洞表,以及黑洞将重新路由到的内存(或临时表)。

CREATE TABLE Blackhole1 LIKE order_details ENGINE = BLACKHOLE;

CREATE TABLE temp_order_results LIKE order_details ENGINE = MEMORY;

设置触发器
现在在blackhole表上创建一个触发器,它将插件重新路由到内存表,用qty > 1复制行。

DELIMITER $$

CREATE TRIGGER ai_Blackhole1_each AFTER INSERT ON blackhole1 FOR EACH ROW
BEGIN
  DECLARE ACount INTEGER;
  SET ACount = new.qty;
  WHILE ACount > 1 DO BEGIN
    INSERT INTO temp_order_results 
    VALUES (new.id, new.order_id, new.product_id, 1, new.price)
    SET ACount = ACount - 1;
  END; END WHILE;
END $$

DELIMITER ;

进行查询的语句
现在做一个插入..选择进入黑洞

INSERT INTO blackhole1 
  SELECT id, order_id, product_id, qty, price FROM order_details;

选择temp_order_results。

SELECT id, order_id, product_id, qty, price FROM order_details;

答案 1 :(得分:2)

要扩展@ zdennis'answer,您可以在MySQL中执行此操作:

    SELECT order_details.*
      FROM order_details
INNER JOIN kilo
           ON kilo.i < order_details.qty;

其中"kilo"关系的整数为0 - 999,这是一个改编自a post by xaprb的设计:

CREATE TABLE deca (i integer not null);
INSERT INTO deca (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);
CREATE VIEW kilo (i) AS
      SELECT iii.i * 100 + ii.i * 10 + i.i
        FROM deca iii
  CROSS JOIN deca ii
  CROSS JOIN deca i;

答案 2 :(得分:1)

没有真正的表现理由。 MySQL有几个很强的功能:排序,索引,搜索,存储等等。您可以在PHP中执行此操作。

答案 3 :(得分:0)

我认为通过使用将原始表连接到自身并包含Qty-1作为表达式的{{1}}的递归公用表表达式(CTE),可以在Sql Server或Oracle中实现 在CTE的选择列表中的数量。可悲的是,最后我听说MySql还不支持CTE。

另一种选择是构建一个简单的序列表,其中只包含一个数字列和以1开头的行,并以原始表的Qty列中实际拥有的最大数字结尾。您可以将此连接到您的订单表,其中WHERE子句将数字结果限制为小于Qty字段并以这种方式复制行。要快速构建序列表,请创建一个包含0到9记录的数字表,并将每个幂的10次交叉连接到自身。

答案 4 :(得分:0)

适当的响应可能会逐级使用双连接。有关相关信息,请参阅此问题:How can I return multiple identical rows based on a quantity field in the row itself?

虽然这在MySQL中不起作用,但请参阅:How do I make a row generator in MySQL?

如果你正在使用MySQL,你需要满足于在PHP中做这件事或做一些粗略的事情(比如Johan发布的触发器)。如果是这样的话,我会投票简单地用PHP来做。

答案 5 :(得分:0)

我被要求做同样的事情以避免光标。我的解决方案适用于SQL Server,并且非常简单,因为对于我的情况,qty永远不会超过99,所以这里有一个使用临时表的示例:

create table #t (
     id int
    ,qty int
)

insert into #t values (1,2)
insert into #t values (2,3)

create table #n (
     id int
)

insert into #n values (1)
insert into #n values (2)
insert into #n values (3)
insert into #n values (4)
insert into #n values (5)

select t.*
from #t t
inner join #n n on
    n.id <= t.qty

您只需要在#n中插入您期望的最大数量(在我的情况下为99)。