Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> select join - problem
bartekn80
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2013

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


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;

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


"Takie rzeczy tylko w Erze".
To się robi na kliencie. (zapytanie masz dobre)
Go to the top of the page
+Quote Post
bartekn80
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2013

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


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.

Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2013

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


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.

Go to the top of the page
+Quote Post
pmir13
post
Post #6





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


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





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 3.07.2013

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


No kurde Piwko dla ciebie.

A ja tyle sie z tym mordowałem.

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