MYSQL:将AVERAGE和LIKE语句合并为一个

时间:2013-06-13 14:08:53

标签: mysql

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

我想有一个搜索功能,它将从啤酒表中选择所有,然后检查myBeers表以获得平均值,如果该啤酒被列出。

在联接中,beerID是两个表的共同字段。

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

SELECT *   
FROM beers   
WHERE name LIKE :name

另一个是myBeers表,它具有userID和beerID以及评级和评论列。我有一个看起来像这样的查询:

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

我想将这些结合到一个语句中,该语句将在啤酒表中搜索某些名称,然后从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')

我得到了一大堆。

如果有人能帮助我,我将不胜感激。我试图包括一切。谢谢你的帮助!

1 个答案:

答案 0 :(得分: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。即使beers表中没有匹配的行,LEFT JOIN也会返回myBeers表中的所有行。