Ik heb een query waarmee ik een gemiddeld cijfer wil bepalen van een hotel.


SELECT `hotels`.*, 
       (SELECT AVG(rating) 
              FROM hotelreviews WHERE hotel_id = hotels.id  
              WHERE (rating IS NOT NULL AND rating > 0)
              GROUP BY hotel_id) AS `avgrating` 
FROM `hotels` 
WHERE (id = '2791')


Als ik de 'WHERE' weglaat uit de subquery, gaat het goed, echter wanneer ik de voorwaarden toevoeg geeft mysql een fout. Zo'n typische fout waarmee je denkt, wat is er?


#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (rating IS NOT NULL AND rating > 0) GROUP BY hotel_id) AS `avgrating` FROM' at line 1
@Blanche, oke, je hebt me overtuigd.

Heb gelijk nog iets vreemds met deze query:


SELECT regions.id AS id, regions.name AS state, countries.name AS country, COUNT(hotelreviews.id) AS num
	FROM countries
	LEFT JOIN regions ON countries.id = regions.country_id
	LEFT JOIN cities ON regions.id = cities.region_id
	LEFT JOIN hotels ON hotels.city_id = cities.id
	LEFT JOIN hotelreviews ON hotelreviews.hotel_id = hotels.id
	WHERE countries.code IN ('USA', 'CAN') AND (hotelreviews.approved IS NULL OR hotelreviews.approved = 1)
	GROUP BY countries.id, regions.id, regions.name, countries.name
	ORDER BY countries.name ASC, regions.name ASC


Het doel is om alle regios te tonen met het aantal beschikbare reviews. Echter wordt hierbij of 0, 2 of hoger getoond. Dit is vreemd omdat sommige hotels maar 1 review hebben.

Snapt iemand waarom COUNT() dit doet. Ik heb deze bewust op de kolom hotelreviews.id gezet, COUNT() telt alleen wanneer geen NULL
Zijn de hogere waarden ook allen een veelvoud van 2?
Hmm, ik moet maar niet werken op zaterdag.

Wederom iets stoms wat ik niet had gezien. Er waren wel twee reviews, echter op een ander scherm werden deze niet getoond omdat ik daar een voorwaarde had, die ik niet in deze query meenam.
Ik kon al niets vinden in die query :)

Reageren