【问题标题】:My Sql Query - Insert new record in table under specific conditions from other two tables and avoid duplicate entriesMy Sql Query - 在特定条件下从其他两个表中插入新记录并避免重复条目
【发布时间】:2011-08-31 00:32:43
【问题描述】:

我整天都想弄清楚这一点,但没有成功。

我有 3 张桌子叫做:selections、auctions、game

我需要实现的是在 'auctions' 表中写入的每个游戏的 'selections' 表中插入 3 条新记录(它们在两个表中都用 ID 号标记)但一些必要的数据也在 'game' 中与“拍卖”表连接的表(使用 BetfairMark)。并避免重复输入(如果有的话)。

'Auctions' 表有以下列: id (以前写在表中,它与“选择”表连接) BetfairMark(必须与 'game' 中的 'BetfairMarketID' 相同才能正确连接 'auctions' 表与 'game' 表), title(之前写在表格里)

'Selections' 表有以下列:
id(这是该表中生成的每条新记录的自动递增数字), auctionid(这是必须在此处使用此查询创建的数字,与拍卖表中的“id”相同) order(必须生成 3 条记录中的每一条,查询订单号为 1、2、3) 赔率(需要从游戏表中为每条记录获取正确的赔率)

'Game' 表有以下列: BetfairMarketID(需要与拍卖表中的“BetfairMark”编号相同,以找出正确的行以从该表中获取数据) ABack('order' 1下需要进入选择新记录的赔率) BBack('order'2下需要进入选择新记录的赔率) DrawBack('order'下需要进入选择新记录的赔率3)

总结需要实现这一点: - 在'selections'表中插入3条新记录,其中每条记录都需要用顺序1、2和3标记。必须根据拍卖表关系显示正确​​的'auctionid'编号。 - 如果会有重复的记录条目(这意味着某些记录将具有相同的“拍卖ID”编号并且不会插入相同的“订单”编号记录。 - 在这 3 条新记录中,必须在 'game' 表中的 'ABack'、'BBack'、'DrawBack' 列中输入 'odds' 数字(根据 BetfairMarketID/BetfairMark 与 'auctions' 表相同的数字)。

我尝试了这个,希望在正确的轨道上,但需要大量修改:

INSERT INTO selections (selections.auctionid, selections.order, selections.odds)
VALUES 
((SELECT id FROM auctions), '1', (select ABack FROM game, auctions WHERE game.BetfairMarketID = auctions.BetfairMark)),
((SELECT id FROM auctions), '2', (select BBack FROM game, auctions WHERE game.BetfairMarketID = BetfairMark)),
((SELECT id FROM auctions), '3', (select DrawBack FROM game, auctions WHERE game.BetfairMarketID = BetfairMark))

但收到此错误:[Err] 1242 - 子查询返回多于 1 行

【问题讨论】:

  • 简单说明:查询需要在'selection'表中为每个auctionid(在'auction'表中给出)有3条记录。这 3 条记录中的每一条都需要有不同的订单号(1、2 和 3)和不同的赔率数字(从“游戏”表中给出)。不允许重复的条目(相同的拍卖 ID 和订单号)。
  • (显然 OP 还没有解决他们的问题,因为他们在这里再次询问:stackoverflow.com/questions/7669470/… - 添加赏金以帮助他们获得答案。)
  • @Ivy 如果已解决,请将您的答案标记为已接受,以帮助遇到同样问题的其他人。

标签: php mysql insert


【解决方案1】:

已解决! 为每一行创建了 3 个单独的查询,现在可以使用!

因此,在 (auctionid, order) 对中添加 UNIQUE INDEX 后,就有了这个可行的代码:

INSERT IGNORE INTO
selections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
1,
PlayerA,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

INSERT IGNORE INTO
elections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
2,
PlayerB,
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

INSERT IGNORE INTO
selections
(
selections.auctionid,
selections.order,
selections.title,
startamount
)
SELECT
auctions.id,
3,
'third text',
0.01
FROM
auctions, game
WHERE
auctions.BetfairMark = game.BetfairMarketID
;

【讨论】:

    【解决方案2】:

    由于您有一个 PHP 标记,我假设使用一些 PHP 代码来处理这是可能的。

    使用 PHP 运行以下查询

    SELECT id, BetfairMarketID FROM game
    

    然后,遍历每一行并执行以下操作:

    INSERT INTO selections (selections.auctionid, selections.order, selections.odds)
    VALUES 
    ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '1', (select ABack FROM game WHERE id = $id)),
    ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '2', (select BBack FROM game WHERE id = $id)),
    ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '3', (select DrawBack FROM game WHERE id = $id))
    

    如果我理解你想要做什么,这应该可以。如果我错了,请发表评论!

    【讨论】:

    • 呃。我不打算在 PHP 中这样做。但可以第一次在 PHP 中尝试!你能这么好心,给我一个完整的PHP代码例子吗?
    • 仍然不明白如何使用此查询并遍历每一行。你这是什么意思?我知道如何使用 PHP 进行常用的 mysql 查询,但不确定如何将此查询用于 PHP。有人可以帮忙吗?
    • 试过了但没用: mysql_query (" SELECT id, BetfairMarketID FROM game { INSERT INTO selections (selections.auctionid, selections.order, selections.odds) VALUES { ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '1', (select ABack FROM game WHERE id = $id)), { ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '2', (select BBack FROM game WHERE id = $id)), { ((SELECT id FROM auctions WHERE BetfairMark = $BetfairMarketID), '3', (select DrawBack FROM game WHERE id = $id)) } } } } ");
    猜你喜欢
    • 2014-08-16
    • 2019-11-16
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2013-06-16
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多