php / mysql:在一个'查询'中附加2个或更多外键?

时间:2013-04-09 15:13:57

标签: php mysql


我对此的解决方案位于底部

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

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

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

我一直潜伏着stackoverflow一段时间,找到我的问题的答案,我的智慧结束了。我发现了很多线程,比如下面的两个链接,我相信人们会问同样的事情,但是我似乎无法解决问题,让我的解决方案在我的情况下工作。根据我的理解,我需要为表使用别名,但是我尝试了对解决方案的多种不同解释,并且无法重新创建解决方案。

How do I merge two or more rows based on their foreign key

mysql query 2 foreign keys

-

我有两个表('Minions and Ability'),其中一个有四个外键链接到另一个。

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

这是我用于查询的php代码,主要取自PHP和MySQL Web开发第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>";
            } 

2 个答案:

答案 0 :(得分: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";

答案 1 :(得分:0)

你可以尝试一个子查询,它只打印每个minion的属性中包含的每个能力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";
}