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>";
}
?>
答案 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变量替换硬编码韩语的位置,以使其在您的系统中正常工作。
您遇到的问题是您没有指定如何对行进行分组,这导致服务器将它们放入所有组中。当你试图在没有聚合(如avg)的情况下选择不在分组中的列(没有列)时,大多数DBMS都会出错,虽然它看起来不是,但它允许你以这种方式分组并简单地返回第一行每个非聚合。
注意您仍然可能需要对avg(r.rating)
进行某种空处理,因为朝鲜肋骨没有评级,它将返回NULL
的平均评级。您可以使用IFNULL
这样处理:IFNULL(avg(r.rating),2.5) AS rt
。如果评分超过5,我建议使用2.5,所以你的无评级是中间数,但你可以使用0或5或任何东西。