Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL] Zwrócenie wyników których id znajduje się w innej tabeli
tlaguz
post
Post #1





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 5.01.2009

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


Witam.

Mam dwie tabele.
Dla potrzeb pytania przyjmijmy ich strukturę:

PIERWSZA TABELA:
  1. `id` MEDIUMINT AUTO_INCREMENT NOT NULL UNIQUE KEY,
  2. `name` VARCHAR(255) NOT NULL UNIQUE KEY,
  3. PRIMARY KEY(`id`);


DRUGA TABELA:
  1. `id` MEDIUMINT AUTO_INCREMENT NOT NULL UNIQUE KEY,
  2. `someid` MEDIUMINT,
  3. PRIMARY KEY(`id`)


Potrzebuję wyświetlić wszystkie rekordy z tabeli A których ID jest gdziekolwiek wpisane w kolumnie someid tabeli B...

Nie mam pojęcia jak się do tego zabrać.

Warto też zaznaczyć, iż muszę to rozwiązać za pomocą SQL'a. Mógłbym pobrać dwie tabele i sprawdzić je za pomocą PHP, ale nie o to chodzi w tym skrypcie.

Z góry dziękuję za odpowiedź i pozdrawiam
tlaguz

Ten post edytował tlaguz 28.12.2009, 00:27:16
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
darko
post
Post #2





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

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


Ustaw w drugiej tabeli na polu someid klucz obcy (foreign key) do id z pierwszej tabeli i wtedy:
  1. SELECT * FROM tabela1 WHERE tabela1.id=tabela2.someid
Go to the top of the page
+Quote Post
tlaguz
post
Post #3





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 5.01.2009

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


Niestety otrzymuję taki błąd:

#1054 - Unknown column 'tabela2.someid' in 'where clause'

:/
Go to the top of the page
+Quote Post
cim
post
Post #4





Grupa: Zarejestrowani
Postów: 208
Pomógł: 28
Dołączył: 9.08.2004
Skąd: Stargard

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


Witam,

może spróbuj podzapytaniem:
  1. SELECT * FROM tabela1 WHERE id IN (SELECT someid FROM tabela2)


Pozdrawiam

[dodane]
W razie potrzeby w podzapytaniu dopisz 'distinct' do 'someid', żeby każdą wartość zwracało tylko raz.
[/dodane]

Ten post edytował cim 28.12.2009, 01:21:54
Go to the top of the page
+Quote Post
tlaguz
post
Post #5





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 5.01.2009

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


cim jesteś wielki, działa (IMG:style_emoticons/default/biggrin.gif)

Pomogłeś!

Temat do zamknięcia.
Go to the top of the page
+Quote Post
darko
post
Post #6





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

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


Cytat(tlaguz @ 28.12.2009, 01:06:40 ) *
Niestety otrzymuję taki błąd:

#1054 - Unknown column 'tabela2.someid' in 'where clause'

:/

(IMG:style_emoticons/default/smile.gif) wystarczyło, żebyś w miejsce tabela2 wstawił rzeczywistą nazwę swojej drugiej tabeli.
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%)
-----


Cytat(cim @ 28.12.2009, 01:18:49 ) *
  1. SELECT * FROM tabela1 WHERE id IN (SELECT someid FROM tabela2)


Poniżej MySQL 5.4 potencjalnie bardzo wolne zapytanie. Lepiej przepisać na JOINa.
Go to the top of the page
+Quote Post
cim
post
Post #8





Grupa: Zarejestrowani
Postów: 208
Pomógł: 28
Dołączył: 9.08.2004
Skąd: Stargard

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


Cytat(Mchl @ 28.12.2009, 01:35:15 ) *
Poniżej MySQL 5.4 potencjalnie bardzo wolne zapytanie. Lepiej przepisać na JOINa.

A tego nie wiedziałem, zn. tak jak poniżej będzie wydajniej? Bo efekt w wynikach ten sam.
  1. SELECT tab1.* FROM `tab1` JOIN tab2 ON tab1.id=tab2.someid


Pozdrawiam

Ten post edytował cim 28.12.2009, 01:43:49
Go to the top of the page
+Quote Post
tlaguz
post
Post #9





Grupa: Zarejestrowani
Postów: 37
Pomógł: 0
Dołączył: 5.01.2009

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


Cytat(darko @ 28.12.2009, 01:30:23 ) *
(IMG:style_emoticons/default/smile.gif) wystarczyło, żebyś w miejsce tabela2 wstawił rzeczywistą nazwę swojej drugiej tabeli.


Wstawiłem, wstawiłem ^^
Aż taki głupi to ja nie jestem.

Chciałem tylko nawiązać do pierwszego mojego postu.

Niemniej jednak już sobie poradziłem
Dzięki wszystkim za pomoc!
Go to the top of the page
+Quote Post
Mchl
post
Post #10





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

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


Cytat(cim @ 28.12.2009, 01:42:38 ) *
A tego nie wiedziałem, zn. tak jak poniżej będzie wydajniej? Bo efekt w wynikach ten sam.

Pozdrawiam


Im więcej wierszy w obu tabelach (zwłaszcza w tab1), tym większa różnica będzie na korzyść JOINa. Dla porządku ja bym dopisał, że to INNER JOIN.
http://dev.mysql.com/doc/refman/5.1/en/rew...subqueries.html

Ten post edytował Mchl 28.12.2009, 10:29:51
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: 22.08.2025 - 16:26