我循环遍历表格,任务,根据该Quest存储NPC ID,然后循环遍历表 NPC ,并按照NPC返回所有NPC数据标识。
红色框的值应该返回。
表:任务
表: npcs
我循环遍历任务收到的来自任务表的NPC_id,并转储数组以确保它不会丢失任何数据。没有数据丢失。
var_dump($allNPCIDs); //all 5 results
然后转储查询以确保内爆字符串不会丢失任何数据。没有数据丢失。
var_dump($qry); //query shows all 5 results
问题:
但是当我转储$row
时,我错过了重复的npd_id:
var_dump($row); //missing 1 row, the duplicate npc_id
PHP:
foreach ($allNPCIDsPerQuest as $item) {
foreach ($item as $value) {
array_push($allNPCIDs, $value);
}
}
echo "DUMPING ARRAY";
var_dump($allNPCIDs);
//load NPC data
$qry =
'SELECT N.*
FROM npcs N
WHERE npc_id IN ("' . implode('", "', $allNPCIDs) . '")';
echo "DUMPING QRY STRING";
var_dump($qry);
$result = $mysqli->query($qry) or die(mysqli_error($mysqli));
$i = 0;
echo "DUMPING ROW DATA";
while ($row = $result->fetch_assoc()) {
var_dump($row);
$i++;
}
如何在phpMyAdmin mySQL DB中关闭删除重复行数据的约束?
答案 0 :(得分:1)
这不是你可以关闭的约束。它是您正在执行的查询的结构。使用IN(1,2,3,4,1)与使用IN(1,2,3,4)相同。只是过滤npcs表并决定是否选择特定行的条件。将id列出两次不会使行在npcs表中存在两次...因此无法选择两次。
使用SELECT无法完成您想要的任务。
您要么使用UNION:
(SELECT * FROM npcs WHERE npc_id=1) UNION
(SELECT * FROM npcs WHERE npc_id=2) UNION
(SELECT * FROM npcs WHERE npc_id=3) UNION
(SELECT * FROM npcs WHERE npc_id=4) UNION
(SELECT * FROM npcs WHERE npc_id=1)
或者您首先在临时表中插入ID,然后像这样选择SELECT:
SELECT N.* FROM npcs N JOIN temptable T on N.npc_id=T.npc_id
或者你做客户端,循环,为每个ID执行查询并将数据放在一起。
可能还有其他解决方案,但现在不会想到它们。
答案 1 :(得分:1)
这不是phpMyAdmin中的约束,而是SQL的工作原理。
SELECT N.* FROM npcs N
将返回5行(npc_id 1到5)。 WHERE
将此限制为符合条件的行。如果重复条件,则不会获得额外的行。
您可以将表格任务中的npc_id列提取到查询表quests_to_npcs中,其中包含quest_id和npc_id列。这将包含任务中每个npc的一行。
您的查询可能如下所示:
SELECT n.*
FROM quests AS q
INNER JOIN quests_to_npcs AS q2n ON q.quest_id = q2n.quest_id
INNER JOIN npcs AS n ON q2n.npc_id = n.npc_id
答案 2 :(得分:1)
您应该创建另一个名为quest_npcs
的表。
CREATE TABLE quest_npcs (
quest_id INT,
npc_id INT
);
然后,您可以简单地将每个任务的所有关联npc_id
存储在一行中。
然后为特定任务提取所有NPC的信息,这是一个简单的联接。
SELECT npcs.*
FROM quest_npcs
INNER JOIN npcs
ON npcs.npc_id = quest_npcs.npc_id
WHERE quest_npcs.quest_id = ???
如果你想在同一个查询中获得有关任务的信息,你甚至可以将任务表加入到该任务表中。
SELECT npcs.*, quests.*
FROM quests
INNER JOIN quest_npcs
ON quest_npcs.quest_id = quests.quest_id
INNER JOIN npcs
ON npcs.npc_id = quest_npcs.npc_id
WHERE quest_npcs.quest_id = ???
或者在您的情况下,而不是WHERE quest_npcs.quest_id = ???
,使用IN()
上的quest_id
来同时获得一堆任务。
SELECT npcs.*, quests.*
FROM quests
INNER JOIN quest_npcs
ON quest_npcs.quest_id = quests.quest_id
INNER JOIN npcs
ON npcs.npc_id = quest_npcs.npc_id
WHERE quest_npcs.quest_id IN(???)