如果表中的某个字段大于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
)?
答案 0 :(得分:2)
设置表格
首先创建你要插入的黑洞表,以及黑洞将重新路由到的内存(或临时表)。
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)。