Pokaż wyniki od 1 do 6 z 6

Wątek: Wybór tabeli na podstawie wartości pola z innej

  1. #1
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie Wybór tabeli na podstawie wartości pola z innej

    Załóżmy że mam 3 tabele: A, B i C. Tabela A posiada pole `type` które ma wartość 0 lub 1. Jeśli wartość pola A.`type` wynosi 0 chciałbym pobierać wszystkie dane z tabeli B, natomiast jeśli 1, z tabeli C, czyli coś w tym rodzaju:
    Kod:
    SELECT A.`type`, (SELECT * FROM IF(A.`type`=0;'B','C') WHERE `id`=1 LIMIT 1) FROM A WHERE A.`id`=5
    Mam to obecnie rozwiązane w PHP, jednak zastanawiałem się, czy nie dałoby się tego utworzyć w jednym zapytaniu. Przy tego typu kodzie wyskakuje mi błąd składni czy coś w tym stylu. Chciałbym uniknąć stosowania UNION czy JOIN, bo przy większej ilości rekordów raczej będzie to wolniejsze niż rozwiązanie problemu za pomocą PHP.

    A propos - w tabelach B i C znajdują się pola podobne do A.`type` jednak mają inne nazwy. Mimo to dla odpowiednika pola A.`type` w tabeli B wszystkie wartości wynoszą 0, a dla tabeli C 1.

  2. #2
    Zarejestrowany Awatar Azides
    Dołączył
    Jan 2009
    Posty
    485

    Domyślnie

    A może tak procedura składowana? Z tego co wyczytałem na SB to korzystasz z InnoDB.
    Definiujesz zmienną.
    Nazwijmy sobie ją A_TYPE.
    Następnie pobierasz a.type i przypisujesz tę wartość do zmiennej.
    Sprawdzasz IF'em wartość A_TYPE i wykonujesz odpowiednie polecenie select w ciele IF, lub ELSE.
    Ew. możesz spróbować stworzyć procedurę i wrzucić po prostu Twoje polecenie SQL, tam powinno zadziałać.

  3. #3
    Programista
    Dołączył
    Sep 2007
    Posty
    622

    Domyślnie

    Mógłbyś bardziej ogólnie opisać sytuację? Mam wrażenie, że szukasz rozwiązania problemu który sam stworzyłeś i zmiana struktury bazy danych miałaby więcej sensu w tym przypadku.

    Jeżeli już jednak rozmawiamy bezpośrednio o tego typu zapytaniu, to ja bym zrobił coś takiego:

    SELECT A.`type`, B.*, C.*
    LEFT JOIN B ON A.type = 0 AND B.related_id = A.id
    LEFT JOIN C ON A.type = 1 AND C.related_id = A.id
    FROM A WHERE A.`id`=5

    Ewentualnie jeżeli w tabelach B i C kolumny się pokrywają, to będzie jakoś tak:

    SELECT A.`type`, COALESCE(B.column_1, C.column_1), COALESCE(B.column_2, C.column_2), ...
    LEFT JOIN B ON A.type = 0 AND B.related_id = A.id
    LEFT JOIN C ON A.type = 1 AND C.related_id = A.id
    FROM A WHERE A.`id`=5
    http://orodlin.pl/ - Orodlin.pl Team Member
    http://blog.albitos.eu - Albi's Jogger - Z pamiętnika młodego programisty
    http://wsosnowski.pl - wizytówka

    Mam do wynajęcia miejsce na serwerze dedykowanym. Ktoś zainteresowany?

  4. #4
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    Mógłbyś bardziej ogólnie opisać sytuację?
    Bardziej ogólnie raczej nie dam rady, ale dokładniej z pewnością.

    Mam bowiem tabelę gdzie przechowuję dane dt. mapy i nazywa się `map`, są tam różne pola i jednym z pól jest pole `type`, które mówi czy na danym polu się coś znajduje (jeśli 0 to pole jest puste, jeśli >0 na danym polu znajduje się placówka gracza). Oprócz tego mam dwie inne tabele, `towns` i `mines`, w których odpowiednio umieszczane są rekordy dotyczące miast i kopalń które znajdują się na mapie. Niestety - tabel nie mogę za bardzo połączyć ze względu na to, że ich struktura się nieco różni. Jednak w obu znajdują się pola które teraz nazwijmy `type`, w których dla całej tabeli wartość wynosi 1 (w przypadku `mines`) lub 2 (w przypadku `towns`). Mam nadzieję, że ten opis wam pomoże w czymkolwiek.

  5. #5
    Programista
    Dołączył
    Sep 2007
    Posty
    622

    Domyślnie

    Dla tego konkretnego przypadku - po prostu zrób dwa zapytania. KISS
    http://orodlin.pl/ - Orodlin.pl Team Member
    http://blog.albitos.eu - Albi's Jogger - Z pamiętnika młodego programisty
    http://wsosnowski.pl - wizytówka

    Mam do wynajęcia miejsce na serwerze dedykowanym. Ktoś zainteresowany?

  6. #6
    Zasłużony Awatar Rodkan
    Dołączył
    Mar 2011
    Posty
    1,465

    Domyślnie

    Mam dwa, z czystej ciekawości chciałem wiedzieć czy nie da rady tego jakoś upchać

Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. Odpowiedzi: 0
    Ostatni post / autor: 31-12-2011, 11:51
  2. [SQL] dwie wartości z jednej tabeli według różnych warunków
    Przez Imperator_Edi w dziale PHP / MySql
    Odpowiedzi: 4
    Ostatni post / autor: 02-05-2011, 09:27
  3. Ekran logowania na innej stronie
    Przez elektronik666 w dziale Pytania dotyczące silnika Xnova
    Odpowiedzi: 1
    Ostatni post / autor: 18-09-2010, 18:12
  4. zawartość innej strony w divie/tabeli.
    Przez Azides w dziale HTML / CSS
    Odpowiedzi: 9
    Ostatni post / autor: 15-09-2010, 20:42
  5. brak pola rank w tabeli users
    Przez Ashcan w dziale Race
    Odpowiedzi: 2
    Ostatni post / autor: 19-09-2009, 18:22

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •