2

我对此的解决方案在底部

我的问题是:我正在尝试显示外键数据,但由于有多个外键,我得到每个外键的“重复”查询。

http://i.imgur.com/Gfqx497.png

如您所见,我可以查询正确的数据,但我不知道如何将其他外键数据附加到相同的“单行输出”。

我已经潜伏了一段时间的 stackoverflow 来找到我的问题的答案,但我束手无策。我发现了很多线程,例如下面的两个链接,我相信人们在问同样的事情,但是我似乎无法全神贯注地让解决方案在我的情况下工作。据我了解,我需要为表使用别名,但是我尝试了多种不同的解决方案解释,但无法重新创建解决方案。

如何根据外键合并两行或多行

mysql查询2个外键

--

我有两张表(“奴才和能力”),其中一张有四个外键链接到另一张。

http://i.imgur.com/ctpFHur.png

这是我用于查询的 php 代码,主要取自 PHP 和 MySQL Web Development 第 4 版(Welling,Thomson),我购买它是为了让我开始使用 php 和 mysql。

$query = "SELECT minions.name, minions.summon, minions.attack,
          minions.health, minions.race, minions.rarity, 
          minions.ability1, minions.ability2, minions.ability3, 
          minions.ability4, minions.imagebig, 
          ability.ability 
          AS ability FROM minions 
          INNER JOIN ability on 
          minions.ability1 = ability.abilityid 
          OR minions.ability2=ability.abilityid"; 

            //Only trying for 2 foreign keys to try get it to work



            $result = $db->query($query);
            $num_results = $result->num_rows;
            echo "<p>Number of items found: ".$num_results."</p>";



            for ($i=0; $i <$num_results; $i++){
                $row = $result->fetch_assoc();
                //echo "<p><strong>".($i+1).". Name: ";
                echo "<p><strong>";
                echo htmlspecialchars(stripslashes($row['name']));
                echo "</strong><br />Summoning cost: ";
                echo stripslashes($row['summon']);
                echo "<br />Attack: ";
                echo stripslashes($row['attack']);
                echo "<br />Health: ";
                echo stripslashes($row['health']);
                echo "<br />Race: ";
                echo stripslashes($row['race']);
                echo "<br />Rarity: ";
                echo stripslashes($row['rarity']);                  
                //if (stripslashes($row['ability'] != NULL)){
                    echo "<br />Abilty: ";
                    echo stripslashes($row['ability']); 
                //}
                echo "<br />";
                $imageMinion = stripslashes($row['imagebig']);  

                // $iwidth = 25;
                // $iheight = 100;
                // echo '<img src="img/'.$imageMinion.'.png" style="width:'.$iwidth.'px;height:'.$iheight.'px;">';

                //echo "<br />";
                echo '<img src="img/'.$imageMinion.'.png">';
                echo "</p>";

有人可以指导我让它正确显示吗?我试图遵循其他解决方案,但似乎无法正确命名别名,如果我认为这是解决方案是正确的。

========编辑关于verbumSapienti的答案===========

我很尴尬地无法让您的答案正常工作。这就是代码的外观。

                $query = "SELECT minions.name, minions.summon, minions.attack, minions.health, 
                      minions.race, minions.rarity, minions.ability1, minions.ability2, 
                      minions.ability3, minions.ability4, minions.imagebig, 
                      ability.ability 
                      AS ability 
                      FROM minions 
                      INNER JOIN ability 
                      ON minions.ability1 = ability.abilityid 
                      OR minions.ability2 = ability.abilityid 
                      OR minions.ability3 = ability.abilityid 
                      OR minions.ability4 = ability.abilityid"; 

            $result = $db->query($query);
            $num_results = $result->num_rows;
            echo "<p>Number of items found: ".$num_results."</p>";

            for ($i=0; $i <$num_results; $i++){
                $row = $result->fetch_assoc();

                $abilities = array('ability1', 'ability2', 'ability3', 'ability4');
                foreach($abilities as $ability)
                {
                    $q = "SELECT $ability FROM minions WHERE name={$row['name']}";
                    $result = $db->query($q);
                    $row2 = $result->fetch_assoc();
                    $abilitiesArr[] = $row2[$ability];
                }

                echo "<p><strong>";
                echo htmlspecialchars(stripslashes($row['name']));
                echo "</strong><br />Summoning cost: ";
                echo stripslashes($row['summon']);
                echo "<br />Attack: ";
                echo stripslashes($row['attack']);
                echo "<br />Health: ";
                echo stripslashes($row['health']);
                echo "<br />Race: ";
                echo stripslashes($row['race']);
                echo "<br />Rarity: ";
                echo stripslashes($row['rarity']);      

                foreach($abilitiesArr as $ability)
                    {
                        $q = "SELECT $ability FROM ability";
                        $result = $db->query($q);
                        $row = $result->fetch_assoc();
                        echo "<br />Ability: $row";
                    }  


                /*if (stripslashes($row['ability'] != NULL)){
                    echo "<br />Abilty: ";
                    echo stripslashes($row['ability']); 
                }*/

                echo "<br />";
                $imageMinion = stripslashes($row['imagebig']);          
                echo '<img src="img/'.$imageMinion.'.png">';                    
                echo "</p>";
            }

我尝试过改变一些事情,但没有取得任何成功。照原样,我收到以下错误: Fatal error: Call to a member function fetch_assoc() on a non-object in D:\Xampp\htdocs\ocduels\results.php on line 87

这是: $row2 = $result->fetch_assoc();

在:

                    $abilities = array('ability1', 'ability2', 'ability3', 'ability4');
                foreach($abilities as $ability)
                {
                    $q = "SELECT $ability FROM minions WHERE name={$row['name']}";
                    $result = $db->query($q);
                    $row2 = $result->fetch_assoc();
                    $abilitiesArr[] = $row2[$ability];
                }

::我对此的解决方案:: 这似乎有效。我认为它效率不高,但足以让我继续学习。谢谢大家的回复。这允许我找到一个“Minion”,并且当有超过 1 个带数据的外键时,只有一个“Minion”实例。

                $query =   "SELECT 
                        m.name as m_name, 
                        m.summon as m_summon, 
                        m.attack as m_attack,
                        m.health as m_health,
                        m.race as m_race,
                        m.rarity as m_rarity,
                        m.ability1 as m_ability1, 
                        m.ability2 as m_ability2, 
                        aa.ability as a_ability, 
                        ab.ability as b_ability,
                        m.imagebig as m_imagebig
                        FROM minions m
                        LEFT JOIN ability aa 
                        ON m.ability1 = aa.abilityid
                        LEFT JOIN ability ab
                        ON m.ability2 = ab.abilityid";                        

            $result = $db->query($query);
            $num_results = $result->num_rows;
            echo "<p>Number of items found: ".$num_results."</p>";

            for ($i=0; $i <$num_results; $i++){
                $row = $result->fetch_assoc();

                echo "<p><strong>";
                echo htmlspecialchars(stripslashes($row['m_name']));
                echo "</strong><br />Summoning cost: ";
                echo stripslashes($row['m_summon']);
                echo "<br />Attack: ";
                echo stripslashes($row['m_attack']);
                echo "<br />Health: ";
                echo stripslashes($row['m_health']);
                echo "<br />Race: ";
                echo stripslashes($row['m_race']);
                echo "<br />Rarity: ";
                echo stripslashes($row['m_rarity']);        

                if (stripslashes($row['a_ability'] != NULL)){
                    echo "<br />Ability 1: ";
                    echo stripslashes($row['a_ability']);
                }

                if (stripslashes($row['b_ability'] != NULL)){
                    echo "<br />Ability 2: ";
                    echo stripslashes($row['b_ability']);                                   
                }

                echo "<br />";
                $imageMinion = stripslashes($row['m_imagebig']);        
                echo '<img src="img/'.$imageMinion.'.png">';                    
                echo "</p>";
            } 
4

2 回答 2

0

尝试 DISTINCT 关键字来限制重复值。

SELECT DISTINCT minions.name, minions.summon, minions.attack,
          minions.health, minions.race, minions.rarity, 
          minions.ability1, minions.ability2, minions.ability3, 
          minions.ability4, minions.imagebig, 
          ability.ability 
          AS ability FROM minions 
          INNER JOIN ability on 
          minions.ability1 = ability.abilityid 
          OR minions.ability2=ability.abilityid";
于 2013-04-09T15:58:21.703 回答
0

您可以尝试一个子查询,该子查询仅打印每个仆从属性中包含的每个能力 ID 的能力文本,可能类似于以下内容:

$abilities = array('ability1', 'ability2', 'ability3', 'ability4');
foreach($abilities as $ability)
{
    $q = "SELECT $ability FROM minions WHERE name={$row['name']}";
    $result = $db->query($q);
    $row2 = $result->fetch_assoc()
    $abilitiesArr[] = $row2[$ability];
}

然后替换

echo "<br />Abilty: ";
echo stripslashes($row['ability']);

foreach($abilitiesArr as $ability)
{
    $q = "SELECT $ability FROM ability";
    $result = $db->query($q);
    $row = $result->fetch_assoc()
    echo "<br />Ability: $row";
}
于 2013-04-09T16:04:37.997 回答