加入2个表无法正常工作

时间:2018-03-07 22:52:28

标签: php mysql sql

Idk我做错了什么。我还是php和mysqli的新手,想知道我做错了什么。我在第一个清单上有的是食物的名称,描述和它们是什么样的食物。在我的第二个清单上,我有食物的评级。 TableImg

所以,举个例子,我点击韩国食物,所有食物都带有cuisine_type = korean将显示在我的页面上。当mysqli_fetch_array($ query_type)它显示泡菜和肋骨但是当我替换$ query_fetch时它只显示第一个泡菜。我的目标是从cuisine_type中正确显示所有食物并将它们的评级附加到它们。

    <?php
    if(isset($_GET['type'])){

      $type = (string)$_GET['type'];
       }

 (Displays only 1 of them)->  $query_fetch = mysqli_query($connect,"SELECT 
         cuisine.*,AVG(ratings.cuisine_rating) AS rt FROM cuisine 
        LEFT JOIN ratings ON cuisine.dish_name = ratings.cuisine_name WHERE 
        cuisine_type = '$type'");

 (Displays everything)->  $query_type = mysqli_query($connect,"SELECT * FROM cuisine WHERE 
       cuisine_fetch ='$type'");

       while($show = mysqli_fetch_array($query_type)){
        echo "
        <div class='box'>
        <img class='foodimg' src='dish/".$show['dish_img'].".jpg'>
        <figcaption class='title'>".$show['dish_name']."</figcaption>
        <div class='text'>".$show['text']."</div>


        </div>
        </div>";



      }
?>

2 个答案:

答案 0 :(得分:0)

假设TableImg是正确的,您在查询中使用的名称与数据库中的名称不同。

SELECT 
  cuisine.*,
  AVG(ratings.cuisine_rating) AS rt
FROM cuisine 
LEFT JOIN ratings ON
  cuisine.dish_name = ratings.cuisine_name
WHERE 
  cuisine_type = '$type'

请改用:

SELECT 
  cuisine.*,
  AVG(ratings.Rating) AS rt
FROM cuisine 
LEFT JOIN ratings ON
  cuisine.dish_name = ratings.dish_name
WHERE 
  cuisine_type = '$type'

答案 1 :(得分:0)

你想要的是使用GROUP来做你的平均值。

SELECT c.*, avg(r.rating) AS rt FROM cuisine c
LEFT JOIN ratings r
ON c.dish_name = r.dish_name 
WHERE c.cuisine_type = 'korean'
GROUP BY dish_name

可以通过SQLFiddle测试代码。

您需要使用php变量替换硬编码韩语的位置,以使其在您的系统中正常工作。

Result Set

您遇到的问题是您没有指定如何对行进行分组,这导致服务器将它们放入所有组中。当你试图在没有聚合(如avg)的情况下选择不在分组中的列(没有列)时,大多数DBMS都会出错,虽然它看起来不是,但它允许你以这种方式分组并简单地返回第一行每个非聚合。

注意您仍然可能需要对avg(r.rating)进行某种空处理,因为朝鲜肋骨没有评级,它将返回NULL的平均评级。您可以使用IFNULL这样处理:IFNULL(avg(r.rating),2.5) AS rt。如果评分超过5,我建议使用2.5,所以你的无评级是中间数,但你可以使用0或5或任何东西。