Wątek przeniesiony 2020-03-03 13:35 z Inne języki programowania przez hauleth.

Zadanie z MySQL'a? Czy to będzie FULL OUTER JOIN?

0

Zadanie: Tabela wpisy i wpisy_kom. Tabela wpisy zawiera: Lp Czas i Tekst, a tabela wpisy_kom zaweria: Lp NumerWpisu CzasKomenta i TextKomenta. Muszę pobrac te wszystkie komorki w jednym wyszukaniu i posegregować je wg czasu tzn. Czas (we wpisy) i CzasKomenta (we wpisy_kom). Czy ktoś może mi w tym pomóc? Czy tędę musiał zrobić FULL OUTER JOIN?

Dziękuję serdecznie za pomoc
i pozdrawiam! :-)
Kuba

2

Raczej LEFT JOIN, jeżeli masz relacje 1 wpis - N komentarzy, a na to wygląda. FULL OUTER JOIN byłby przydatny, gdybys chciał wyjąc komentarze nieprzyporządkowane do żadnego wpisu.

0
Charles_Ray napisał(a):

Raczej LEFT JOIN, jeżeli masz relacje 1 wpis - N komentarzy, a na to wygląda. FULL OUTER JOIN byłby przydatny, gdybys chciał wyjąc komentarze nieprzyporządkowane do żadnego wpisu.

no hmm...

SELECT wpisy.Lp, wpisy.Czas, wpisy.Tekst, wpisy_kom.Lp, wpisy_kom.NumerWpisu, wpisy_kom.CzasKomenta, wpisy_kom.TextKomenta FROM wpisy FULL OUTER JOIN wpisy_kom ON wpisy.Czas = wpisy_kom.CzasKomenta;

No powiem tak. Do jednego wora wrzucam wpisy i komentarze. Kluczem jest tylko czas utworzenia. Albo wpisu, albo komentarza. Czy mniej więcej dobrze napisałem tego SELECT'a. Nawet go nie zaczynam jeszcze testować, bo na razie ustalam podstawową składnię.

Dziękuję za pomoc.
Kuba

3

Join po czasie? Bez sensu, nie masz klucza obcego?

0
Charles_Ray napisał(a):

Join po czasie? Bez sensu, nie masz klucza obcego?

Może: UNION?


SELECT column1, column2, column3 FROM table1 UNION SELECT column1, column2, column3 FROM table2;

Tylko jak to potem porównać? Czas we wpisy i CzasKomenta we wpisy_kom Hmm... eh. Psia kość.

1

Jak chcesz wyszukać komentarze do postu, to dodaj id_postu do tabelki z komentarzem.

To co teraz wydziwiasz z jakimiś joinami po kolumnie z czasem to totalny brak jakiejkolwiek logiki, jakaś kurna czarna magia i proszenie się o kłopoty w jednym.

1
Jakub Prażmowski napisał(a):
Charles_Ray napisał(a):

Join po czasie? Bez sensu, nie masz klucza obcego?

Może: UNION?


SELECT column1, column2, column3 FROM table1 UNION SELECT column1, column2, column3 FROM table2;

Tylko jak to potem porównać? Czas we wpisy i CzasKomenta we wpisy_kom Hmm... eh. Psia kość.

Porównać znaczy posortować ? Na prawdę piszesz strasznie chaotycznie i ciężko cokolwiek z tego zrozumieć.
Ale .. jeśli faktycznie chcesz połączyć dane z 2 tabel (zakładając że obie mają podobna strukturę) to robisz to UNION jak napisałeś a jeśli chcesz jeszcze posortować ten zbiór to możesz to zrobić np tak (zakładam, że column2 to czas/data) :

SELECT column1, column2, column3
FROM (SELECT column1, column2, column3 FROM table1 UNION SELECT column1, column2, column3 FROM table2)
ORDER by column2

Albo z użyciem CTE:

WITH DanePolaczone
as
(SELECT column1, column2, column3 FROM table1
 UNION 
SELECT column1, column2, column3 FROM table2)

SELECT column1, column2, column3
FROM DanePolaczone
ORDER by column2
0

Porównać znaczy posortować ? Na prawdę piszesz strasznie chaotycznie i ciężko cokolwiek z tego zrozumieć.
Ale .. jeśli faktycznie chcesz połączyć dane z 2 tabel (zakładając że obie mają podobna strukturę) to robisz to UNION jak napisałeś a jeśli chcesz jeszcze posortować ten zbiór to możesz to zrobić np tak (zakładam, że column2 to czas/data) :

SELECT column1, column2, column3
FROM (SELECT column1, column2, column3 FROM table1 UNION SELECT column1, column2, column3 FROM table2)
ORDER by column2

przepraszam ale mamy tutaj dwie kolumny: column2... aha i one wszystkie lecą do column2? no dobra... nie pozostaje mi nic innego jak tylko zacząć powoli próbować... zrobię sobie plik test.php ;-) i na bieżąco będę zdawał relacje

0

Nie, nie zdawaj relacji. Bo się tylko syf robi, jak w każdym innym Twoim wątku... Pisz tylko wtedy, gdy masz serio jakiś KONKRETNY problem.

0

Przepraszam. Ale UNION zakłada, że wszystkie pola z dwóch tabel muszą mi się pokrywać tak? W moim przypadku nie jest tak... zarówno jedna jak i druga tabela zawiera unikalne kolumny...

1

Tak - musisz podać taką samą ilość kolumn i tego samegy typu. Jesli w 1 "secie" masz mniej kolumn to w odpowiedniej kolejności wprowadź puste dane coś jak: '' as column3

I nie bądź taki czuły jak Ci człowiek ... czy tam inny Ser dobrze radzi! I nie pytaj o wszystko zanim nie sprawdzisz, nie przetestujesz u siebie.

0

I nie bądź taki czuły jak Ci człowiek ... czy tam inny Ser dobrze radzi! I nie pytaj o wszystko zanim nie sprawdzisz, nie przetestujesz u siebie.

/*
TABLEA:          1             2              3                 4
wpisy            Lp           Czas               Tekst
wpisy_kom        Lp          CzasKomenta      TextKomenta       NumerWpisu

*/

//QUERY
$query = "SELECT NumerPorzadkowy, CzasUtworzenia, TekstWpisuLubKomentarza, OdnoscnieWpisu FROM (SELECT Lp, Czas, Tekst FROM wpisy UNION SELECT Lp, CzasKomenta, TextKomenta, NumerWpisu FROM wpisy_kom) ORDER by CzasUtworzenia";

No wpisy_kom mają tylko jedną kolumnę więcej... określającą numer którego Komentarza dotyczną

Czy query wygląda dobrze?

2

Nie. Nie zrobiłeś tego co pisałem post wyżej.
W Tabela Wpisy nie masz kolumny 4 ... więc musisz ją sobie stworzyć z pustymi danymi np. (albo co tam chesz).
Do tego używasz nowych nazw kolumn ? Skąd silnik ma je znać ?? Musisz nadac takie aliasy w 1 secie ... kolejne już nie trzeba.

Czyli poprawnie będzie:

"SELECT NumerPorzadkowy, CzasUtworzenia, TekstWpisuLubKomentarza, OdnoscnieWpisu 
FROM (SELECT Lp as NumerPorzadkowy, Czas as CzasUtworzenia, Tekst as TekstWpisuLubKomentarza, null as OdnoscnieWpisu   FROM wpisy 
            UNION
            SELECT Lp, CzasKomenta, TextKomenta, NumerWpisu FROM wpisy_kom) t
ORDER by CzasUtworzenia";
0
//QUERY
$query = "SELECT NumerPorzadkowy, CzasUtworzenia, TekstWpisuLubKomentarza, OdnoscnieWpisu FROM (SELECT Lp as NumerPorzadkowy, Czas as CzasUtworzenia, Tekst as TekstWpisuLubKomentarza, null as OdnoscnieWpisu FROM wpisy UNION SELECT Lp as NumerPorzadkowy, CzasKomenta as CzasUtworzenia , TextKomenta as TekstWpisuLubKomentarza, NumerWpisu as OdnoscnieWpisu FROM wpisy_kom) ORDER by CzasUtworzenia";

I co? Zadziała?

0
//QUERY
$query = "SELECT Lp as LpWpisu, Czas, Tekst, '' as NumerWpisu FROM wpisy UNION ALL SELECT Lp as LpKomenta, CzasKomenta as Czas, TextKomenta, NumerWpisu FROM wpisy_kom ORDER BY Czas";

I co? Czemu ktoś z Was tego za mnie nie zrobił, co?

1

Ten wątek to złoto :D

0

I co? Czemu ktoś z Was tego za mnie nie zrobił, co?

gościu, trochę kultury .. widzę że masz w tym spore braki

1
Jakub Prażmowski napisał(a):
//QUERY
$query = "SELECT Lp as LpWpisu, Czas, Tekst, '' as NumerWpisu FROM wpisy UNION ALL SELECT Lp as LpKomenta, CzasKomenta as Czas, TextKomenta, NumerWpisu FROM wpisy_kom ORDER BY Czas";

I co? Czemu ktoś z Was tego za mnie nie zrobił, co?

Z prostej przyczyny: żebyś się sam nauczył. Teraz zapamiętasz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1