【问题标题】:Three tables joined but need to links ids三个表加入但需要链接 id
【发布时间】:2016-10-25 13:29:59
【问题描述】:

我已加入三个表进行查询。问题是显示每个班级名称然后是狗,但没有将狗名链接到特定节目。它在每个节目中显示相同的狗名列表。我尝试在我的 dogs 表中使用 show_id 来执行此操作,并将其链接到显示表中的 show_id。

三张表分别是:shows、results、dogs。

谁能帮帮我?

<?php
if(isset($_GET['s_id'])) {
    $the_show_id = $_GET['s_id'];

    $view_query = "UPDATE shows SET show_view_count = show_view_count + 1 WHERE  show_id = $the_show_id ";
    $send_query = mysqli_query($connection, $view_query);

    if(!$send_query) {

        die("query failed" );
    }


    if(isset($_SESSION['user_role']) && $_SESSION['user_role'] == 'admin' ) {

        $query = "SELECT * FROM shows WHERE show_id = $the_show_id ";

    } else {

        $query = "SELECT * FROM shows WHERE show_id = $the_show_id AND  show_status = 'published' ";
    }

    $select_all_shows_query = mysqli_query($connection,$query);

    if(mysqli_num_rows($select_all_shows_query) < 1) {

        echo "<h1 class='text-center'>No shows available</h1>";

    } else { 

        while($row = mysqli_fetch_assoc($select_all_shows_query)) {
            $show_name = $row['show_title'];
            $show_author = $row['show_author'];
            $show_date = $row['show_date'];
            $show_content = $row['show_content'];

            ?>

            <h1 class="page-header">
                Shows
            </h1>
            <!-- First Blog Post -->
            <h2>
                <a href="#"><?php echo $show_name ?></a>
            </h2>
            <p class="lead">
                by <a href="index.php"><?php echo $show_author ?></a>
            </p>
            <h4>Show Date: <span class="glyphicon glyphicon-time"> </span>
 <? php echo $show_date ?></h4>
            <hr>
            <div class="row">
                <div class="col-xs-6 col-sm-3"><h4>Class Name</h4></div>    
                <div class="col-xs-6 col-sm-2"><h4>Placement</h4></div>    
                <div class="col-xs-6 col-sm-7"><h4>Dog Name</h4></div>    
            </div><hr>
            <?php  

            $query = "SELECT result.class_name, result.placement, dogs.dog_name 
            FROM result 
            INNER JOIN dogs on result.resultID = dogs.resultIDD
            INNER JOIN shows on dogs.show_id = shows.show_id
            WHERE dog_name NOT LIKE 'absent' GROUP BY shows.show_id";

            $result = mysqli_query($connection, $query) or trigger_error("Query Failed! SQL: $query - Error: ". mysqli_error($connection), E_USER_ERROR);

            if($result) {
                while($row = mysqli_fetch_assoc($result)) {
                    $dog_name = $row['dog_name'];
                    $placement = $row['placement'];
                    $class_name = $row['class_name'];
                    ?> 

                    <div class="row">
                        <div class="col-xs-6 col-sm-3"><p><?php echo $class_name ?></p></div>
                        <div class="col-xs-6 col-sm-2"><p><?php echo $placement ?></p></div>
                        <div class="col-xs-6 col-sm-7"><p><?php echo $dog_name ?></p></div>
                    </div>
                    <?php
                }
            }
        }
        ?>

【问题讨论】:

  • 查询必须显示错误,因为在 where 条件之后您没有在 where 条件中使用别名,它必须像 dogs.dog_name。
  • 没有错误唯一发生的事情是每个节目都列出了所有狗,而不是每个节目特定的狗
  • 在条件完成后尝试使用 GROUP BY shows.show_id 告诉我它返回什么?
  • 为了测试它,我插入了 4 个结果和 4 条狗,查询列出了它们,但显示 1 和 2 仍然有相同的结果和狗,它不是显示每个显示对应的结果和狗?跨度>
  • 我现在已经包含了所有的代码

标签: php sql inner-join


【解决方案1】:

好吧,假设所有其他事情都正常工作,您可能只需要将dogs.show_id(或shows.show_id)添加到选择中。您是否可以尝试下面的查询,然后如果不起作用,请报告您的表结构(您可以使用“show create table TBL_NAME”为三个表中的每一个执行此操作。

<?php
    $query = "
        SELECT
            dogs.show_id,
            result.class_name, result.placement,
            dogs.dog_name
        FROM
            result INNER JOIN
            dogs on result.resultID = dogs.resultIDD INNER JOIN
            shows on dogs.show_id = shows.show_id
        WHERE
            dog_name NOT LIKE 'absent'
    "; 
?>

更新:好的,所以现在我们知道您已经处于一个告诉我们 show_id 的循环中,您只需更新查询以只为该节目拉狗(假设 show_id 实际上在狗表中......除非您将 dog+show_id 作为唯一的复合键,否则它并不是真正属于的位置)。

看看这里我将 $show_id 添加到初始显示查询的声明列表中,然后在查询中使用它来限制该查询中的狗。此外,内部连接在这里不是最好的......恕我直言。

...
while ($row = mysqli_fetch_assoc($select_all_shows_query)) {

  // WE ALREADY KNOW THE SHOW WE'RE IN
  $show_id = $row['show_id']; 

  $show_name = $row['show_title'];
  $show_author = $row['show_author'];
  $show_date = $row['show_date'];
  $show_content = $row['show_content'];
    ?>
      <h1 class="page-header">Shows</h1>

        <!-- First Blog Post -->
        <h2><a href="#"><?php echo $show_name ?></a></h2>
        <p class="lead"> by <a href="index.php"><?php echo $show_author ?></a></p>
        <h4>Show Date: <span class="glyphicon glyphicon-time"> </span> <?php echo $show_date ?></h4>
        <hr>
        <div class="row">
          <div class="col-xs-6 col-sm-3"><h4>Class Name</h4></div>
          <div class="col-xs-6 col-sm-2"><h4>Placement</h4></div>
          <div class="col-xs-6 col-sm-7"><h4>Dog Name</h4></div>
        </div>
        <hr>
      <?php

        // SO UPDATE THE QUERY TO ONLY PULL THAT SHOW'S DOGS
        $query = "SELECT result.class_name, result.placement, dogs.dog_name
                  FROM result
                  LEFT JOIN dogs on result.resultID = dogs.resultIDD
                  WHERE dogs.show_idd = $show_id AND dog_name NOT LIKE 'absent'";

         $result = mysqli_query($connection, $query) or trigger_error
           ("Query Failed! SQL: $query - Error: ". mysqli_error
           ($connection), E_USER_ERROR);

         if ($result) {
           while ($row = mysqli_fetch_assoc($result)) {
             $dog_name = $row['dog_name'];
             $placement = $row['placement'];
             $class_name = $row['class_name'];
             ?>

               <div class="row">
                 <div class="col-xs-6 col-sm-3"><p><?php echo $class_name ?></p></div>
                 <div class="col-xs-6 col-sm-2"><p><?php echo $placement ?></p></div>
                 <div class="col-xs-6 col-sm-7"><p><?php echo $dog_name ?></p></div>
               </div>

【讨论】:

  • 什么是正确的语法和添加它们的代码,它应该在查询的 where 部分吗?
  • 如果名为 dog_name 的列在所有表中不是唯一的,则 Bhavin 是正确的。 @garyfalkland 我已经在我的答案中更新了查询。你能测试它吗?要选择 show_id,只需在“SELECT”之后添加“dogs.show_id”。您将不得不在您的 html 中使用该变量,您没有提供给我们,以便我们可以帮助处理该部分。
  • $query = "SELECT dogs.show_id, ...你坚持吗?
  • 我添加了 dogs.show_id 但它仍然显示所有节目中的所有狗?
  • 你能告诉我每个表中有哪些列吗?特别是 show_id 在哪里 - 在狗表中吗?是否也在结果表中?
猜你喜欢
  • 1970-01-01
  • 2015-04-11
  • 2021-04-15
  • 2019-09-13
  • 2014-07-12
  • 2015-09-06
  • 2016-05-26
  • 2016-02-04
  • 2019-09-05
相关资源
最近更新 更多