2013-06-19 3 views
0

У меня есть следующий запрос:SQL запросов внутренних соединений и ограничение макс 3 самых последних

SELECT * FROM `product` INNER JOIN `shop` 
ON `product`.shop_id= `shop`.id; 

Я хотел, чтобы все продукты из всех магазинов у меня есть, но я хотел бы получить 3 продукты макс из каждого магазина. Есть ли способ указать MAX для каждого соединения?

Вот мой продукт таблица:

enter image description here

Вот мой магазин стол:

enter image description here

+0

Используйте подзапрос для продуктов и используйте основное помещение для магазина. Таким образом, вы не подключаетесь и можете использовать LIMIT для 3-х результатов на ваших продуктах. – Hazaart

+0

. Добавить структуру таблицы и некоторые данные примера с выводом, который вы хотите получить. –

+0

Пример @Hazaart. – adit

ответ

0

Попробуйте это:

SELECT * 
FROM (SELECT * 
     FROM (SELECT *, IF(@shop = (@shop:=p.shop_id), @id:[email protected] + 1, @id := 1) temp 
      FROM `product` p, (SELECT @shop:=0, @id:=1) AS A 
      ORDER BY p.shop_id, p.updated DESC) AS B 
     WHERE temp <= 3) AS C 
INNER JOIN `shop` s ON C.shop_id= s.id; 
0

Запрос:

SELECT * 
FROM `product` p 
INNER JOIN `shop` s 
    ON `p`.shop_id= `s`.id 
WHERE p.id IN (SELECT p2.id 
       FROM `product` p2 
       WHERE p2.shop_id = s.id 
       ORDER BY p2.updated DESC 
       LIMIT 3) 

или, может быть:

SELECT * 
FROM `product` p 
INNER JOIN `shop` s 
    ON `p`.shop_id= `s`.id 
WHERE EXISTS (SELECT p2.id 
       FROM `product` p2 
       WHERE p2.shop_id = s.id 
       ORDER BY p2.updated DESC 
       LIMIT 3) 
0

Задание ограничения внутри подзапроса является немного сложным в MySQL (не невозможно, но немного сложнее).

Если вы хотите только три последних идентификатора продукта для каждого магазина, и вы можете жить с ними в одной строке, вы можете использовать group_concat(). Запрос гораздо проще:

SELECT shop.*, 
     substring_index(group_concat(product.id order by product.updated desc), ',', 3) as ThreeProducts 
FROM `product` INNER JOIN 
    `shop` 
    ON `product`.shop_id= `shop`.id 
group by shop.id; 

Результаты будут размещать идентификаторы продуктов в одном поле, как это: '1,2,3'.

0

Важно знать определения таблиц в терминах первичных ключей, внешних ключей и т. Д., Чтобы придумать SQL для решения проблемы. Из изображений не ясно, является ли product.id уникальным или нет. Я подозреваю, что здесь, возможно, проблема определения модели данных. Если таблицы не нормализованы в необходимой степени, будет очень сложно (когда-нибудь не удастся) прочитать соответствующие данные назад. Должны выглядеть нормализованные таблицы.

продукта (первичный ключ идентификатор, ....)

Магазин (идентификатор первичный ключ, ....)

и таблица соотношения говорят.

Shop_Product (ссылки shop_id Магазин (идентификатор), prod_id отсылок (ID), ...)

Это будет полезно, чтобы помочь вам, если вы можете отправить определение таблицы.

0

попытайтесь использовать лимит в своем коде. Может работать

Смежные вопросы