Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] pobieranie 3 rekorow ktorych wartosc jest taka sama
Forum PHP.pl > Forum > Bazy danych > MySQL
terabit
Witam,
zastanawiam się jak wykonać coś takiego w MySQL:

mam sobie tabele w której występują kolumny id, moje_id ...
chciałbym pobrać tylko te rekordy dla których moje_id powtarza się 3 razy

Przykład tabeli:
id | moje_id
1 | 40
2 | 40
3 | 5
4 | 5
5 | 5

6 | 2
7 | 2
8 | 2

9 | 7
10| 7

Czyli z tej tabeli ma pozostać tylko:
id | moje_id
3 | 5
4 | 5
5 | 5

6 | 2
7 | 2
8 | 2


jak już uda mi się to wykonać to będę to wrzucał do nowej tabeli i pobierał na stronę tylko część według daty...

Ma ktoś jakiś pomysł jak to wykonać?

Pozdrawiam
wookieb
  1. SELECT * FROM tabela
  2. WHERE id IN (SELECT id FROM tabela
  3. GROUP BY moje_id
  4. HAVING count(id) = 3)
terabit
@wookieb, tylko dlaczego count(id) = 3 ?
mi się wydaje że id malo ma do tego, maja to byc tylko te rekordy w ktorych moje_id powtarza sie 3 razy, nie mniej i nie wiecej...

od tego zapytania FF mi sie zwiesil winksmiley.jpg
wookieb
Przeczytaj manual do tej funkcji, nie chce mi się tłumaczyć dlaczego tak jest aczkolwiek powinno działac.
A ile masz rekordów w tej twojej tabeli?
Dodatkowo czy masz klucz na polu "moje_id" ?
Dodatkowo co to za test wydajności zapytanie przez "firefox"?
terabit
Cytat(wookieb @ 22.08.2010, 12:16:40 ) *
A ile masz rekordów w tej twojej tabeli?

ponad 13000

Cytat(wookieb @ 22.08.2010, 12:16:40 ) *
Dodatkowo czy masz klucz na polu "moje_id" ?

nie

Cytat(wookieb @ 22.08.2010, 12:16:40 ) *
Dodatkowo co to za test wydajności zapytanie przez "firefox"?

przez phpmyadmin odpalalem winksmiley.jpg
a co polecasz? winksmiley.jpg
wookieb
To załóż indeks.
To testowania polecam linię komend (jeżeli masz taką możliwość)
Jeżeli założenie indeksu nic nie pomoże to bedziesz musiał stworzyć dodatkową tabelę przechowujące moje_id i ilość wystąpień.
Moje zapytanie było błędne, oto poprawione
  1. SELECT * FROM tabela
  2. WHERE moje_id IN (SELECT moje_id FROM tabela
  3. GROUP BY moje_id
  4. HAVING count(id) = 3)

Z moich testów wynika, że po założeniu indeksu powinno smigać aż miło
Nie wiem czy wiesz jak założyć iindeks ale na wszelki wypadek podpowiem
  1. ALTER TABLE tabela ADD INDEX ( `moje_id` )
terabit
Zrobiłem limit i zaczęło działać, jeszcze musze potestować bez limitów...
no i zakładać indexu nie trzeba było winksmiley.jpg

kod wygląda tak:
  1. SELECT *
  2. FROM `tabela`
  3. WHERE (moje_id IN
  4. (SELECT moje_id
  5. FROM `tabela`
  6. GROUP BY moje_id
  7. HAVING (COUNT(moje_id) = 3)
  8. )
  9. ) LIMIT 0, 15 ;


wookieb wielkie dzięki za pomoc smile.gif
wookieb
A indeks założyłeś?
I koniecznie, ale to koniecznie użyj silnika InnoDB w tej tabeli.
terabit
nie założyłem, a co da założenie?
Można wiedzieć dlaczego InnoDB, będzie szybciej? winksmiley.jpg
wookieb
Cytat(terabit @ 22.08.2010, 13:11:15 ) *
nie założyłem, a co da założenie?

Potężne zwiększenie prędkości wykonywania zapytania
Cytat(terabit @ 22.08.2010, 13:11:15 ) *
Można wiedzieć dlaczego InnoDB, będzie szybciej? winksmiley.jpg

Dużo by gadać (po prostu większy wykład) ale uwierz da jeszcze większą szybkość wykonywania smile.gif
Zresztą porównaj dla testów aktualny czas z tym po mojej radzie.
terabit
no nooo
różnica ogromna!
wielkie dzięki :]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.