Как выбрать из базы одинаковые записи по 3?

Quexx

Новичок
Как выбрать из базы одинаковые записи по 3?

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

Quexx

Новичок
Нет.., Вы меня не правильно поняли. Объясню на примере.
Например, есть записи:
id | name_sh | adres
1 Вивальди ул.Иваново
2 Вивальди ул.Бабоново
3 Вивальди ул.Селезнева
4 Вивальди ул.Курчатова
5 Вивальди ул.Рублева
6 и более ...
7 Реванш ул.Рублева
8 Реванш ул.Курчатова
9 Реванш ул.Бабоново
10 Реванш ул.Зыкова
11 и более ...

Как видим каждый магазин повторяется только улицы разные. Магазинов много и все они много раз повторяются. Вот нужно выбрать чтобы каждого магазина по 3 записи:

Вивальди ул.Иваново
Вивальди ул.Бабоново
Вивальди ул.Селезнева

Реванш ул.Рублева
Реванш ул.Курчатова
Реванш ул.Бабоново
 

alpine

Новичок
Quexx
Известные мне решения:
- Завести в базе вторичный счетчик для группы и пересчитывать его при внесении изменений в группу записей. Тогда можно будет быстро выбирать одним запросом.
- Реализовать этот счетчик для группы на пользовательских переменных(@a:=). Но тогда выбрать одним запросом(без подзапросов) скорее всего не получится и будет тормозить.

-~{}~ 14.12.06 18:30:

- и простое решение: в два запроса, - первым выбираем N фирм, формируем UNION ALL из N селектов с LIMIT 3 и затем в коде, при необходимости, результаты запросов объединяем.
 

zerkms

TDD infected
Команда форума
Но тогда выбрать одним запросом(без подзапросов) скорее всего не получится
[sql]
SET @a = 0;
SELECT CONCAT(`somefield`, '__', (@a := @a + 1) % 3) AS `grp_cnd` FROM ... GROUP BY `grp_cnd`
[/sql]
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ещё вариант: написать процедуру, к-рая будет делать запрос и отдавать из каждой группы по 3 первых записи. MySQL же вроде уже умеет процедуры?
 

alpine

Новичок
zerkms
Учитывая:
9.3. User Variables
...
Note: In a SELECT statement, each expression is evaluated only when sent to the client. This means that in a HAVING, GROUP BY, or ORDER BY clause, you cannot refer to an expression that involves variables that are set in the SELECT list. For example, the following statement does not work as expected
...
я все же считаю что более корректно будет вот так, тоесть с вложенным запросом:
[sql]
set @a=0, @prev:=(select shop_name from shops limit 1);
select * from (
select *, @prev, @a:=IF(@prev=shop_name, @a+1, 1) as group_counter, @prev:=shop_name from shops
) as s where group_counter<=3;
[/sql]

-~{}~ 15.12.06 13:26:

PS Запрос тестировался на MySQL 5.0.27-community-nt

-~{}~ 15.12.06 13:48:

Sad Spirit
Умеет, но на процедурах как-то стремно ... :)
 

Quexx

Новичок
alpine, пример, который привел zerkms, работает корректно, по крайней мере работает именно так, как я и хотел). MySQL 5.0.22. Ваш пример охотно разберу... лишним не будет. Спасибо.
 
Сверху