Я пытаюсь отобразить список магазинов каждый с 3 случайными объектами из их магазина, если у них есть 3 или больше списка, которые активно рекламируют. У меня есть 3 таблицы: один для магазинов – “Магазины”, один для списков – “Списки” и тот, который отслеживает активных рекламодателей – “AdShops”.
Используя ниже оператора, возвращенные списки случайны однако, я не получаю точно 3 списка (строки), возвращенные на магазин.
SELECT AdShops.ID, Shops.url, Shops.image_url, Shops.user_name AS shop_name,
Shops.title, L.listing_id AS listing_id, L.title AS listing_title,
L.price as price, L.image_url AS listing_image_url, L.url AS listing_url
FROM AdShops INNER JOIN
Shops ON AdShops.user_id = Shops.user_id INNER JOIN
Listings AS L ON Shops.user_id = L.user_id
WHERE (Shops.is_vacation = 0 AND Shops.listing_count > 2 AND
L.listing_id IN
(SELECT TOP 3 L2.listing_id
FROM Listings AS L2
WHERE L2.listing_id IN
(SELECT TOP 100 PERCENT L3.listing_id
FROM Listings AS L3
WHERE (L3.user_id = L.user_id)
)
ORDER BY NEWID()
)
)
ORDER BY Shops.shop_name
Я озадачен. У кого-либо есть какие-либо идеи о том, как зафиксировать его?
Идеальное решение было бы одной записью на хранилище с этими 3 списками (и связанные данные) были в столбцах и не строках – действительно ли это возможно?
Если я не ошибаюсь, приведенный ниже запрос должен дать вам каждый user_id, имеющий как минимум 3 случайных идентификатора листинга.
SELECT user_id
, listing_id
FROM (
SELECT l.user_id
, l.listing_id
, RowNumber = ROW_NUMBER() OVER (PARTITION BY l.user_id ORDER BY NEWID())
FROM Listings l
INNER JOIN (
SELECT user_id
FROM Listings
GROUP BY
user_id
HAVING COUNT(*) >= 3
) cnt ON cnt.user_id = l.user_id
) l
WHERE l.RowNumber <= 3
Спасибо Ливену за ключ к проблеме. Полное решение выглядит следующим образом:
SELECT AdShops.ID, Shops.url, Shops.image_url,
Shops.user_name AS shop_name, Shops.title, L.listing_id AS listing_id,
L.title AS listing_title, L.price as price,
L.image_url AS listing_image_url, L.url AS listing_url
FROM AdShops INNER JOIN
Shops ON AdShops.user_id = Shops.user_id INNER JOIN
Listings AS L ON Shops.user_id = L.user_id
WHERE (Shops.is_vacation = 0 AND Shops.listing_count > 2 AND
L.listing_id IN
(SELECT listing_id
FROM
(SELECT l2.user_id , l2.listing_id, RowNumber = ROW_NUMBER()
OVER (PARTITION BY l2.user_id ORDER BY NEWID())
FROM Listings l2 INNER JOIN
(SELECT user_id
FROM Listings
GROUP BY user_id
HAVING COUNT(*) >= 3
) cnt ON cnt.user_id = l2.user_id
) l2
WHERE l2.RowNumber <= 3 and L2.user_id = L.user_id
)
)
ORDER BY Shops.shop_name
Наслаждайтесь!