2014-11-02 2 views
0

У меня есть три таблицы:предела Mysql с группой по

  1. категория
  2. Промишленого
  3. business_category (имеющее поле, идентификатор, category_id, buisness_id)

One Категория Принадлежит Многие бизнес
и один бизнес могут иметь несколько категорий

Теперь я пытаюсь сделать это, и я хочу, чтобы получить следующие результаты:

Category 1 

buisenn 1 
buisness 2 
buisnesss 3 


Category 2 

business 1 for cat2 
business 2 for cat 2 
business 3 for cat 2 

Я хочу показать только три бизнес для каждой категории.

Это вопрос, что я пробовал:

SELECT `category`.`name` AS `category_name`, 
     `category`.`id` AS category_id, 
     `business`.`avg_service_price` AS avg_price, 
     `business`.`name` AS `business_name`, 
     `business`.`address`, 
     `business`.`address2`, 
     `business`.`city`, 
     `business`.`state`, 
     `business`.`zipcode`, 
     `business`.`id` AS `business_id`, 
     `business`.`lat`,`business`.`lon` 
    FROM `business_category` 
    LEFT JOIN `business` 
     ON `business_category`.`business_id` = `business`.`id` 
    LEFT JOIN `category` 
     ON `business_category`.`category_id` = `category`.`id` 
    GROUP BY `business`.`id` 
    LIMIT 0,3 

Это показывает только 3 результаты.

Может ли кто-нибудь дать мне представление?

Thanks

+0

Снятие LIMIT 0,3? – geoandri

+0

он покажет все результаты. Мне нужна 3 бизнес-форма для каждой категории –

+0

Это не значит, что у вас ожидаемый результат. Я предлагаю вам добавить его. Но используя LIMIT 0,3, вы получите первые три результата вашего запроса, поэтому, даже если ваш запрос будет правильным, вы никогда не получите три бизнеса для каждой категории. – geoandri

ответ

1

Вы не можете этого сделать. Предел используется только для того, чтобы получить 3 строки вашего запроса и что вы хотите получить все результаты, но всего 3 элемента для каждой категории.

Решение может быть, сначала получить все категории, а затем создать запрос для каждой категории с лимитом 3. Другим решением может быть получение всех результатов, а затем удаление тех, которые вы не хотите.

Первое решение работает медленнее, но для второго требуется больше памяти.

1

Вам нужен эквивалент «групповой максимум». См. my blog, который имеет этот пример:

SELECT 
    province, n, city, population 
FROM 
    (SELECT @prev := '', @n := 0) init 
JOIN 
    (SELECT @n := if(province != @prev, 1, @n + 1) AS n, 
      @prev := province, 
      province, city, population 
     FROM Canada 
     ORDER BY 
      province ASC, 
      population DESC 
) x 
WHERE n <= 3 
ORDER BY province, n;