Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Różna konstrukcja zapytania ale ten sam wynik
yalus
post
Post #1





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


witam,

czy ponisze dwa zapytania powinny zwrócić taką samą liczbe rekordów?

  1. SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id
  2. SELECT * FROM tabela1 WHERE id IN (SELECT id FROM tabela2 WHERE tabela1.id=tabela2.id)



pozdrawiam


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
Max Damage
post
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 19
Dołączył: 14.06.2007

Ostrzeżenie: (0%)
-----


Tak. A jeśli chodzi o łączenie tabel to używa się JOIN:
  1. SELECT * FROM tabela1 JOIN tabela2 ON tabela1.id=tabela2.id

IN chyba lepiej nie używać (a już zwłaszcza w takim zapytaniu), bo podobno jest wolne.


--------------------
"Wszyscy wiedzą, że czegoś nie da się zrobić, i przychodzi taki jeden, który nie wie, że się nie da, i on właśnie to robi." - Albert Einstein
Go to the top of the page
+Quote Post
Mchl
post
Post #3





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Nie tyle IN jest wolne, co podzapytanie w części WHERE zapytania (bo jest wykonywane dla każdego wiersza z tabeli tabela1). Podobno 5.4 już potrafi to zoptymalizować sobie, ale nie sprawdzałem.

Zapytanie zapisane w 1 linijce optymizer przepisze na postać podaną przez Max Damage.
Go to the top of the page
+Quote Post
yalus
post
Post #4





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


dzieki,
tak znam roznice pomiedzy podanymi przeze mnie zapytaniami i rowniez wiem jak polaczyc dwie tabele przy uzyciu JOIN

ale dlaczego te dwa zapytania wykonane u mnie na tych samych tabelach daja mi rozna ilosc rekordow?


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
Mchl
post
Post #5





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


A dają? To ciekawe. Chętnie bym rzucił okiem na te tabele.
Go to the top of the page
+Quote Post
yalus
post
Post #6





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


no wlasnie bardzo ciekawe

oto tabele:

  1. CREATE TABLE `tabela1` (
  2. `mobile` varchar(11) DEFAULT NULL,
  3. `plik` text,
  4. `1` text,
  5. `2` text,
  6. `3` text,
  7. `4` text,
  8. `5` text,
  9. `6` text,
  10. `7` text,
  11. `8` text,
  12. `9` text,
  13. `10` text)
  14.  
  15. CREATE TABLE `tabela2` (
  16. `mobile` varchar(11) DEFAULT NULL,
  17. `plik` text,
  18. `1` text,
  19. `2` text,
  20. `3` text,
  21. `4` text,
  22. `5` text,
  23. `6` text,
  24. `7` text,
  25. `8` text,
  26. `9` text,
  27. `10` text)


a oto zapytania ktorych uzywam:

  1. SELECT * FROM tabela1,tabela2 WHERE tabela1.mobile=tabela2.mobile -- zwraca 816 rekordow
  2. SELECT * FROM tabela1 WHERE mobile IN (SELECT mobile FROM tabela2 WHERE tabela1.mobile=tabela2.mobile) -- zwraca 691 rekordow




--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
Mchl
post
Post #7





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


11 pól TEXT? blinksmiley.gif Albo grubo przesadziłeś, albo nie chcę wiedzieć po co Ci to winksmiley.jpg

Wstawiłem sobie te dwie tabele, wypełniłem losowymi danymi i puściłem oba zapytania. Oba daję tyle samo wierszy.
Go to the top of the page
+Quote Post
yalus
post
Post #8





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


wiem, wiem z tymi textami..... winksmiley.jpg

jakas sugestia dlaczego u mnie tak sie dzieje? chyba typy pol nie maja z tym nic wspolnego?


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
Mchl
post
Post #9





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


W żadnym wypadku nie powinny mieć... Dziwne to...
Go to the top of the page
+Quote Post
yalus
post
Post #10





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


ok, tak czy inaczej dzieki za pomoc. jakos musze dojsc do tego co jest grane


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
Zyx
post
Post #11





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Powyższe dwa zapytania mogą zwrócić identyczną ilość danych jedynie w przypadku, gdy wartości pól mobile nie powtarzają się w obrębie tabeli. Przyjrzyj się uważnie. W pierwszym zapytaniu masz dwie tabele złączone przez INNER JOIN, czyli automatycznie robisz z nich iloczyn kartezjański. Jeśli w "A" masz dwa wiersze z wartością "123456" i w B też dwa wiersze z czymś takim, daje Ci to cztery wiersze wynikowe:

A.1 z B.1
A.1 z B.2
A.2 z B.1
A.2 z B.2

W drugim przypadku pobierasz dane z jednej tabeli. Podzapytanie służy Ci jedynie do wybrania dozwolonych wartości mobile, a więc uzyskujesz:

A.1
A.2

Ot i cała filozofia.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Mchl
post
Post #12





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Aż sobie guza nabiłem jak sobie przywaliłem dłonią w czoło.
Go to the top of the page
+Quote Post
darko
post
Post #13





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Kolumny mobile nie są kluczami głównymi.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
yalus
post
Post #14





Grupa: Zarejestrowani
Postów: 281
Pomógł: 0
Dołączył: 8.07.2005
Skąd: EU

Ostrzeżenie: (0%)
-----


@Mchl: co masz na mysli?

@darko: a musza byc?


--------------------
człowiek nie sznurek wszystko wytrzyma
Go to the top of the page
+Quote Post
darko
post
Post #15





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(yalus @ 28.01.2010, 18:25:00 ) *
@Mchl: co masz na mysli?

@darko: a musza byc?

Oczywiście, że nie muszą, ale w przypadku relacyjnych silników baz dobrze byłoby gdyby były (uniknąłbyś takich zagwozdek w przyszłości), poza tym wyciąganie danych po kluczach obcych jest szybsze niż po polu o typie varchar (jeśli się mylę to proszę mnie poprawić).


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Mchl
post
Post #16





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


Cytat(yalus @ 28.01.2010, 18:25:00 ) *
@Mchl: co masz na mysli?


To, że Zyx ma oczywiście rację biggrin.gif

Czy byłyby tutaj założone klucze czy nie, nie miałoby na wynik znaczenia. Jeśli chodzi o wydajność, to oczywiście założenie kluczy na kolumny mobile (niekoniecznie głównych, bo w tabela2 najwyraźniej nie jest to kolumna unikalna, a więc nie mamy tutaj relacji 1 do 1) przyspieszyłoby pracę tych zapytań.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 11:02