Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Нужно вывести 2 самых популярных заказа для каждой позиции
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Нужно вывести 2 самых популярных заказа для каждой позиции

Страниц (1): [1]
 

1. ugin_root - 30 Мая, 2018 - 13:46:43 - перейти к сообщению
Итак есть 3 таблицы:

    Ресторан (restaurant)
    Блюдо (dish)
    Заказ (purchase)

Нужно вывести все рестораны и 2 самых популярных блюда к каждому ресторану. По идее этот запрос должен вывести всё так как положено:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3.         restaurant.id,
  4.         restaurant.`name`,
  5.         dish.`name`
  6. FROM
  7.         restaurant
  8.                 INNER JOIN dish ON dish.restaurant_id = restaurant.id
  9. WHERE dish.id IN (
  10.         SELECT t.id
  11.         FROM (
  12.                 SELECT dish.id, dish.restaurant_id, COUNT(*) AS count
  13.                 FROM dish
  14.                         INNER JOIN purchase ON purchase.dish_id = dish.id
  15.                 GROUP BY dish.id
  16.         ) AS t
  17.         WHERE t.restaurant_id = restaurant.id
  18.         LIMIT 2
  19. )
  20. GROUP BY dish.id
  21.  


Но mysql ругается:
Цитата:
[Err] 1235 - This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'


С помощью JOIN это не получилось решить. Какие есть идеи как это сделать?
2. ugin_root - 01 Июня, 2018 - 06:05:54 - перейти к сообщению
Пока что сделал так, но это прям костыль
CODE (SQL):
скопировать код в буфер обмена
  1. SET @restaurant_id := NULL;
  2. SET @iterator := NULL;
  3. SELECT
  4.         restaurant.id,
  5.         restaurant.`name`,
  6.         dish.id AS dish_id,
  7.         dish.`name`,
  8.         t.count,
  9.         t.iterator
  10. FROM restaurant
  11.         INNER JOIN dish ON dish.restaurant_id = restaurant.id
  12.         INNER JOIN (
  13.                 SELECT t.*
  14.                 FROM(
  15.                         SELECT
  16.                                 @iterator := IF(@restaurant_id = t.restaurant_id, @iterator + 1, 0) AS iterator,
  17.                                 @restaurant_id := t.restaurant_id AS restaurant_id,
  18.                                 t.id,
  19.                                 t.count
  20.                         FROM (
  21.                                 SELECT dish.id, dish.restaurant_id, COUNT(*) AS count
  22.                                 FROM dish
  23.                                         INNER JOIN purchase ON purchase.dish_id = dish.id
  24.                                 WHERE YEAR(purchase.date_purchase) = YEAR(NOW())
  25.                                 GROUP BY dish.id
  26.                                 ORDER BY dish.restaurant_id ASC, count DESC
  27.                         ) AS t
  28.                 ) AS t
  29.                 HAVING t.iterator <= 3
  30.         ) AS t ON t.id = dish.id
  31. ORDER BY restaurant.id ASC, t.iterator
  32.  

 

Powered by ExBB FM 1.0 RC1