Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: select join - problem
Forum PHP.pl > Forum > Bazy danych > MySQL
bartekn80
Witam wszystkich
Mam pewien problem z zapytaniem sql i prosiłbym o pomoc.

Mamy dwie tabele.

tabela A
id c1 col2
1 11
2 12
3 13

tabela B
id c1
1 12
2 13
3 12
4 11
5 10

Jakiego zapytania użyć aby tabela A była nadrzedną tabelą. Tzn wyswietaly sie tylko i wylacznie 3 wiersze a nie równiez duplikaty z tabeli B.

Użyłem takiego zapytania.

select * from A join B on A.c1=B.c1;

mmmmmmm
"Takie rzeczy tylko w Erze".
To się robi na kliencie. (zapytanie masz dobre)
bartekn80
Możesz jaśniej bo nie rozumiem.

Potrzebuje zapytania, które wyświetli tylko i wyłącznie 3 wiersze uzgadniając tabele A. Natomiast tam gdzie jest duplikat w tabeli B aby brał ostatni z tabeli.

mmmmmmm
Myślałem, że o coś innego chodzi...
  1. SELECT * FROM A JOIN (SELECT DISTINCT c1 FROM B) B ON b.c1=A.c1

Oczywiście DISTINCT możesz zamienić na GROUP BY, ale wtedy trochę inaczej są indeksy dobierane. Musisz sprawdzić, które wolisz.
bartekn80
No tak ale powyższym przykładzie nie mam dostępu do kolumny c2 tabeli B.

Może dam jeszcze jeden przykład ponieważ nie obrazował całości problemu.

+----------------+
| A |
+----------------+
| C1 | C2 |
| 1 | jeden |
| 2 | dwa |

+------------------+
| B |
+------------------+
| C1 | C2 |
| 1 | jed1 |
| 2 | dwaB |
| 1 | jed2 |



Mam dwie tabele gdzie w tabeli B nie które wartości w kolumnie c1 się powtarzają.

Chodzi o to a by tak połączyć tabele abym miał wynik :

+----------------------------+
| wynik |
+----------------------------+
| A.c1 | A.c2 |B.c2 |
| 1 |jeden | jed2 |
| 2 |dwa | dwaB |



Czyli po prostu tam gdzie jest tabeli B jest wspólny identyfikator zwracał zawszy ostatni rekord.

Siedzę i siedzę nad tym i nie mogę sobie z tym poradzić.

Ostatecznie przefiltruje to w php ale jeśli ktoś znał by sposób w sql'u to było by super.

pmir13
Klasyczny problem typu 'group-wise maximum'.
  1. SELECT a.c1, a.c2 AS a_c2, b1.c2 AS b_c2
  2. FROM tabela_B b1
  3. JOIN
  4. ( SELECT c1, max(id) AS last_id FROM tabela_B
  5. GROUP BY c1 ) b2
  6. ON b1.id = b2.last_id
  7. JOIN tabela_A a ON a.c1 = b1.c1


Przetestuj na sqlfiddle
bartekn80
No kurde Piwko dla ciebie.

A ja tyle sie z tym mordowałem.

Dzieki za pomoc.
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.