禁用唯一的sql行结果约束

时间:2014-05-16 06:13:33

标签: php mysql sql phpmyadmin

我循环遍历表格,任务,根据该Quest存储NPC ID,然后循环遍历表 NPC ,并按照NPC返回所有NPC数据标识。

红色框的值应该返回。

表:任务

enter image description here

表: npcs

enter image description here

  • 我循环遍历任务收到的​​来自任务表的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

enter image description here

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中关闭删除重复行数据的约束?

3 个答案:

答案 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(???)