![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Mam problem ze złączeniem danych z kilku tabel, w zależności od wartości danych w jednej kolumnie.
Dokładniej: mam 3 tabele: PRODUCTS | ID | NAME | .... | AWARDS | ID | NAME |...| OPERATIONS | ID | .... | ACTION | PRODUCT | I teraz pojawia się problem bo mamy ogólnie 3 dostępne akcje: 1 - standard 2 - produkt 3 - nagroda czyli przykładowe rekordy będą wyglądać tak: OPERATIONS | 1 | ... | 1 | NULL | | 2 | ... | 2 | 2 | | 3 | ... | 3 | 1 | | 4 | ... | 2 | 1 | | 5 | ... | 1 | NULL | W wyniku chciałbym otrzymać: QUERY | 1 | ... | 1 | NULL | | 2 | ... | 2 | AWARD 2 NAME | | 3 | ... | 3 | PRODUCT 1 NAME | | 4 | ... | 2 | AWARD 1 NAME | | 5 | ... | 1 | NULL | Zatem JOIN chyba odpada, bo nie będzie wiedział z której tabeli dołączać. Przydałby się IF a może bardziej CASE skleciłem coś takiego z case, ale nie działa tak jak trzeba, w kolumnie NAME dostaje wszędzie NULL:
A może najlepszym rozwiązaniem byłoby dodanie kolumn dla AWARDS i PRODUCTS? Ten post edytował vokiel 23.07.2008, 13:07:06 -------------------- |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Pisze z glowy, wiec wymaga to sprawdzenia
|
|
|
![]() ![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Działające poprawnie zapytanie (bez uproszczeń):
Musi być CASE zamiast IF, bo IF(awards.id IS NULL, products.name, award.name) skutkuje, że wyświetla zawsze, tylko products.name, zmieniłem na początku na IS NOT NULL, żeby wyświetlał, jak pole nie będzie puste (ale wtedy niezależnie od parametru ACTION wyświetlał własnie tylko "products.name". Zatem skorzystałem z CASE, który okazał się tu idealnym rozwiązaniem. @ddiceman bardzo pomocny okazał się Twój LEFT JOIN:
Dzięki ![]() -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 15 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Wydaje mi sie ze wydajniejszym zapytaniem byloby:
Wg mnie powyzszy sposob jest wydajnieszy bo wykonujesz jedno zlaczenie mniej, a operacja zlaczenia jest najbardziej obciazajaca. Pozdrawiam Ten post edytował osiris 24.07.2008, 13:15:47 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za zainteresowanie
![]() Niestety, w Twoim przykładzie, zapytanie wybiera tylko te rekordy, dla których `PROG_POINTS`.`ACTION` = 3 ![]() -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 15 Dołączył: 19.07.2007 Ostrzeżenie: (0%) ![]() ![]() |
Poprawilem
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
No i działa
![]() Trudno mi teraz mierzyć wydajność obu zapytań, bo na stan dzisiajszy w bazie jest jeszcze niewiele rekordów. Pierwsze wyniki Twoje zapytanie: - 0.0035 s - 0.0021 s - 0.0020 s Poprzednie zapytanie: - 0.0021 s - 0.0014 s - 0.0009 s Zatem na razie trudno wskazać szybsze. Zobacze z czasem jak przybędzie danych. Wielkie dzięki za pomoc! pozdrawiam -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 21.06.2025 - 23:15 |