Ograniczanie ilości unikalnych rekordów w tabeli

0

Witajcie,
Mam problem ze skonstruowaniem zapytania MySQL. Docelowo zapytanie będzie obsługiwane przez JPA, ale staram się chwilowo problem rozwiązać od strony czystego MySQL. Moja tabela:

+-----------------+------------+--------------+
|  ID_wydarzenia  |  ID_usera  |  opis        |
+-----------------+------------+--------------+
|  1              |  4         |  jakis opis  |
+-----------------+------------+--------------+
|  2              |  4         |  jakis opis  |
+-----------------+------------+--------------+
|  3              |  4         |  jakis opis  |
+-----------------+------------+--------------+
|  4              |  5         |  jakis opis  |
+-----------------+------------+--------------+
|  5              |  5         |  jakis opis  |
+-----------------+------------+--------------+

Potrzebuję napisać takie zapytanie, które pozwoli mi ograniczyć ilość userów przez nie zwrócone. Wykonując zapytanie na powyższej tabeli z ograniczeniem userów do 2 zapytanie powinno zwrócić całą zawartość powyższej tabeli. Podając jako parametr ograniczenia 1 taką:

+-----------------+------------+--------------+
|  ID_wydarzenia  |  ID_usera  |  opis        |
+-----------------+------------+--------------+
|  1              |  4         |  jakis opis  |
+-----------------+------------+--------------+
|  2              |  4         |  jakis opis  |
+-----------------+------------+--------------+
|  3              |  4         |  jakis opis  |
+-----------------+------------+--------------+

Czyli ograniczyć ilość wystąpień różnych wartości pola ID_usera do np. 2. Problem w tym, że dla każdego usera ilość wydarzeń może być różna.

Liczę na waszą pomoc :)

1
select * from tabela where id_usera in (select id_usera from tabela group by id_usera order by id_usera limit 2) 

Liczba po LIMIT oznacza ilość użytkowników, których rekordy chcesz wyświetlić

0

No dobra, a bez limitu w subquery się da? Bo z tego co się orientuje to JPA tego nie obsługuje

1

Cześć,

Zawsze staraj się wrzucić sqlfiddle, niektóre wersje mysql nie wspierają limit in subqueries itd a jak jest sqlfiddle łatwiej jest dać działające rozwiązanie.

use exam;

drop table  if exists 4p;

create table 4p( 
ID_wydarzenia int not null,
ID_usera int not null,
opis varchar(100) not null );

insert into 4p(ID_wydarzenia ,ID_usera,opis )
values ( 1,4,"jakis opis"),
( 2,4,"jakis opis"),
( 3,4,"jakis opis"),
( 4,5,"jakis opis"),
( 5,5,"jakis opis");


drop temporary table if exists temp4p;

CREATE TEMPORARY TABLE temp4p (id_usera int not null); 
INSERT INTO temp4p
SELECT id_usera 
from 4p
group by id_usera 
limit 1;

Select *
from temp4p;

SELECT * FROM 4p WHERE id_usera IN (
select id_usera
from temp4p
) 

Pozdrawiam

0

Czyli na 1 zapytaniu, bez limitu się tego nie da zrobić?
Co jakby wykonać takie zapytanie

SELECT DISTINCT id_usera FROM tabela LIMIT 2

Rezultaty jego przesłać do programu, a następnie wraz z zapytaniem z IN z powrotem do bazy danych? Czyli zrobić to co napisał @Paweł Dmitruk, tylko za pomocą 2 zapytań?

0

Teraz wpadłem na to, że da się zrobić to w jednym zapytaniu tak jak poniżej, bez tworzenie temporary table i prościej.

SELECT * FROM 4p WHERE id_usera IN (
Select *
from (SELECT id_usera 
FROM 4p
GROUP BY id_usera 
LIMIT 2) n
)

Pozdrawiam

0

Zapytanie chyba takie samo jak napisał @Paweł Dmitruk tylko troche bardziej skomplikowane. Napisałem to używając 2 zapytań :)

1

Paweł napisał zapytanie z funkcją limit w podzapytaniu a w niektórych wersjach MySQL to nie jest wspierane.To które ja napisałem omija ten problem.

Pozdrawiam

0

Tutaj jest LIMIT w podzapytaniu podzapytania. Taka kombinacja działa?

1

08c18903f9.png

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.