0

信息:我需要创建一个 MySQL 代码来从表中选择行数据,根据里面的数据items_rooms将数据插入到表中,然后删除中的数据。但在其中,我还需要从另一个表中收集一些数据来获取拥有该项目的所有者的用户 ID。items_usersitems_roomsitems_roomsitems

因此,最后唯一有数据的表是 items 和 items_users,它们的工作是从items_rooms.

看起来很混乱?我知道,这是我编写的代码,我知道这是完全错误的,但它可能会帮助你。

$getItemRooms = $db->query("SELECT * FROM items_rooms WHERE room_id = '" . $roomid . "'");
    while($roomitem = $getItemRooms->fetch_assoc()) {

        $getItems = $db->query("SELECT * FROM items WHERE item_id = '" . $roomitem['item_id'] . "'");
        while($items = $getItems->fetch_assoc()) {

                $sql->query("INSERT INTO items_users (item_id, user_id) VALUES ('" . $roomitem['item_id'] . "', '" . $items['placedBy'] . "')");
                $sql->query("DELETE FROM items_rooms WHERE room_id = '" . $roomid . "'");
                echo 'done';

        }

    }

因此,例如,room_idinside ofitems_rooms可能是 3。items_rooms如果拥有的项目,则里面有 10 行。我需要将它们删除并替换为items_usersitems_rooms没有所有者 ID 的items项目。

4

2 回答 2

1

可以使用INSERT ... SELECT,以及适当的连接:

INSERT INTO items_users (item_id, user_id)
SELECT item_id, items.placedBy
FROM   items JOIN items_rooms USING (item_id)
WHERE  room_id = ?

INSERT如果您的应用程序受到来自多个客户端的同步数据库访问的影响,请注意避免andDELETE语句之间出现竞争风险;特别考虑在上述语句中使用锁定读取DELETE并在同一事务中执行该语句。

于 2013-04-29T14:42:28.147 回答
0

如果您的主要问题是从项目表中获取数据,请尝试使用连接通过一个查询来检索您需要的所有内容。例如:

select *
from items_rooms as ir
inner join items as i on ir.item_id=i.item_id
where item_id = ... 

最好只指定每个表中的必要字段,而不是使用 (*)。您还可以将 INSERT 和 SELECT 语句组合到一个查询中。尝试查看MySQL 参考 它将简化和加速您的 php 脚本

于 2013-04-29T14:54:57.700 回答