Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Różna konstrukcja zapytania ale ten sam wynik
Forum PHP.pl > Forum > Bazy danych > MySQL
yalus
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
Max Damage
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.
Mchl
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.
yalus
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?
Mchl
A dają? To ciekawe. Chętnie bym rzucił okiem na te tabele.
yalus
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


Mchl
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.
yalus
wiem, wiem z tymi textami..... winksmiley.jpg

jakas sugestia dlaczego u mnie tak sie dzieje? chyba typy pol nie maja z tym nic wspolnego?
Mchl
W żadnym wypadku nie powinny mieć... Dziwne to...
yalus
ok, tak czy inaczej dzieki za pomoc. jakos musze dojsc do tego co jest grane
Zyx
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.
Mchl
Aż sobie guza nabiłem jak sobie przywaliłem dłonią w czoło.
darko
Kolumny mobile nie są kluczami głównymi.
yalus
@Mchl: co masz na mysli?

@darko: a musza byc?
darko
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ć).
Mchl
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ń.
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.