Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] pobieranie 3 rekorow ktorych wartosc jest taka sama
terabit
post
Post #1





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. SELECT * FROM tabela
  2. WHERE id IN (SELECT id FROM tabela
  3. GROUP BY moje_id
  4. HAVING count(id) = 3)


Ten post edytował wookieb 22.08.2010, 10:36:46
Go to the top of the page
+Quote Post
terabit
post
Post #3





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


@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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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"?
Go to the top of the page
+Quote Post
terabit
post
Post #5





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


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 (IMG:style_emoticons/default/winksmiley.jpg)
a co polecasz? (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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` )


Ten post edytował wookieb 22.08.2010, 11:48:29
Go to the top of the page
+Quote Post
terabit
post
Post #7





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


Zrobiłem limit i zaczęło działać, jeszcze musze potestować bez limitów...
no i zakładać indexu nie trzeba było (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Ten post edytował terabit 22.08.2010, 11:50:33
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A indeks założyłeś?
I koniecznie, ale to koniecznie użyj silnika InnoDB w tej tabeli.
Go to the top of the page
+Quote Post
terabit
post
Post #9





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


nie założyłem, a co da założenie?
Można wiedzieć dlaczego InnoDB, będzie szybciej? (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
wookieb
post
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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? (IMG:style_emoticons/default/winksmiley.jpg)

Dużo by gadać (po prostu większy wykład) ale uwierz da jeszcze większą szybkość wykonywania (IMG:style_emoticons/default/smile.gif)
Zresztą porównaj dla testów aktualny czas z tym po mojej radzie.
Go to the top of the page
+Quote Post
terabit
post
Post #11





Grupa: Zarejestrowani
Postów: 170
Pomógł: 4
Dołączył: 11.08.2006

Ostrzeżenie: (10%)
X----


no nooo
różnica ogromna!
wielkie dzięki :]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 20:19