1

我正在为一个移动应用程序编写一个 PHP 准备语句,它将搜索数据库中列出的啤酒,并允许用户将这些啤酒添加到他们自己的数据库中,并对它们进行评分和添加评论等。

我希望有一个搜索功能,它将从 beers 表中选择所有内容,然后检查 myBeers 表以获取该啤酒是否列出的平均值。

在连接中,beerID 是两个表的公共字段。

我的数据库中有两张表需要使用:一张是 beer 表,有 5000 条各种啤酒的记录,包括 beerID、name、abv、abu、srm 等。我需要能够进行搜索对于该表,当它是 LIKE 输入时。我有一个看起来像这样的查询:

SELECT *   
FROM beers   
WHERE name LIKE :name

另一个是 myBeers 表,其中包含 userID 和 beerID 以及 rating 和 comments 列。我有一个看起来像这样的查询:

SELECT AVG(rating) as ratingAverage 
FROM myBeers 
WHERE beerID = :beerID' 

我想将这些组合成一个语句,该语句将在 beers 表中搜索类似名称的名称,然后从 myBeers 表中提取平均值。如果没有平均值,那么我希望它显示为 0 而不是 null。

到目前为止,我已经尝试过加入和子查询——但是当我尝试使用 LIKE 选项时它们都卡住了。

我试过这个:

SELECT b.*, AVG(m.rating) AS avgRating
FROM beers b
INNER JOIN myBeers m
ON b.beerID = m.beerID
WHERE (SELECT name
        FROM beers 
        WHERE name LIKE 'Hocus')

而我却一无所获。

如果有人可以帮助我,我将不胜感激。我试图包括所有内容。谢谢你的帮助!

4

1 回答 1

1

您应该能够使用以下内容:

SELECT b.name, 
  AVG(m.rating) AS avgRating 
FROM beers b 
LEFT JOIN myBeers m 
  ON b.beerID = m.beerID 
WHERE b.name LIKE '%Hocus%'
GROUP BY b.name

您不需要在 WHERE 子句中进行其他查询。这将检查name啤酒的 是否像您传入的字符串。您只需要确定您想要%在 LIKE 上使用通配符的位置。我已将它添加到开头和结尾,Hocus但您可能只需要在结尾处使用它。

此外,由于您使用的是聚合函数Avg(),因此您需要使用GROUP BY子句。GROUP BY 应该包含选择列表中包含的其他列。你会注意到我删除了select *广告替换它select b.name

此外,如果您想返回没有评级的啤酒,您将需要使用 LEFT JOIN 而不是 INNER JOIN。LEFT JOIN 将返回表中的所有行,beers即使表中没有匹配的行myBeers

于 2013-06-13T14:11:10.843 回答