Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Relacja 1:1
Forum PHP.pl > Forum > Bazy danych > MySQL
tadeurz
Nie mogę sobie poradzić z prostą rzeczą, głupią relacją 1:1.
Rozwiązanie znałazem w 2 zapytaniach, ale coś czuje że można to zrobić w lepiej.

Mam 2 tabele:
  1. //tabela user_box user_id(PRIMARY) plus setka pól z nazwami jako zwykłe cyfry. W każdej szufladzie(box) znajduje się ID prezentu.
  2. user_box -> user_id,1,2,3,4....97,98,99,100
  3. gift -> id,type,who


Chce pobrać wszystkie szufladki i typ prezentu który się tam znajduje.
nospor
manual mysql -> LEFT JOIN
tadeurz
Nawet nie muszę zaglądać do manuala.

JOIN LEFT z 2 upośledzeniami będzie wyglądało tak:
  1. SELECT
  2. user_box.*
  3. gift.type,
  4. FROM
  5. user_box
  6. LEFT JOIN gift ON
  7. gift.id = user_box.1 OR
  8. gift.id = user_box.2 OR
  9. gift.id = user_box.3 OR
  10. gift.id = user_box.4 OR
  11. gift.id = user_box.5 OR
  12. .........
  13. gift.id = user_box.98 OR
  14. gift.id = user_box.99 OR
  15. gift.id = user_box.100
  16. WHERE user_box.id = ?

Trudno to nazwać problemami raczej upośledzenia mySQL biggrin.gif
1. Przy złączeniu trzeba wypisać pola 0-100. Zamienienie tego na SELECT ? WHERE id IN (SELECT? ) nic nie da bo pola i tak trzeba będzie wypisać (w klauzuli IN będziemy chcieli wszystkie pola BOXów oprócz id(PRIMARY) a nie da się tego zrobić inaczej niż wypisać).
Przy 2 SELECT używam pętli, więc na jedno wychodzi.
2.Tabele wynikowa będzie cholernie wielka. Napisze kilka przykładowych WIERSZÓW:
1. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _ (TYP_GIFT_1)
2. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _ (TYP_GIFT_2)
3. (ID) _ (ID_GIFT_1) ? (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _ (TYP_GIFT_3)
....
99. (ID) _ (ID_GIFT_1) _ (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _ (TYP_GIFT_99)
100. (ID) _ (ID_GIFT_1) _ (ID_GIFT_2) _ (ID_GIFT_3) - ... - (ID_GIFT_98) _ (ID_GIFT_99) _ (ID_GIFT_100) _ (TYP_GIFT_100)

JOIN LEFT ? Może tutaj jest błąd struktury bazy danych, którą trzeba inaczej zaprojektować i wtedy cały problem zniknie.
Mam użytkowników którzy mają plansze 10x10 -> na niej chowają prezenty. Pozostali gracze strzelają w pole odkrywając prezent który się tam skrywa. Zrobienie z tego 1 tabeli w której jest pole i od razu GIFT jest rozwiązaniem na siłę. Każdy strzelony GIFT jest zapisywany, wiec musiałbym po trafieniu go, przenieś do nowej tabeli.
mmmmmmm
Masz chorą strukturę.
5 pól:
-id,
-id_gift,
- numer_pola,
-trafiony,
-kto_trafił
tadeurz
No właśnie struktura jest dobra.
Powyżej oczywiście skracałem tabele, aby pokazać istotę problemu. mmmmmmm dla informacji z jednego pola (w przykładach powyżej chciałem tylko wiedzieć jaki jest typ prezentu ) Twoje rozwiązanie jest dobre.
Tabela gift jest bardziej rozbudowana, sam prezent to obiekt z 10 polami:
  1. Gift:
  2. ID
  3. owner
  4. typ
  5. name
  6. count
  7. prize
  8. reHit
  9. data_hit
  10. data_limit
  11. creates


Nie chce korzystać z żadnych bibliotek ORM, które zrobią to co chce w 1 linijce. Owe biblioteki muszą to jakoś robić. Sam temat założyłem tylko dla upewnienia się czy nie ma lepszego rozwiązania niż 2 odrębne SELECT, bo byłoby dziwne że mySQL nie ma nic do tak prostej relacji.
bpskiba
Jest to wzorcowy przykład z cyklu "jak nie budować struktury bazy"
gdybyś miał tabele:
1 użytkownicy
2 boxy
3 uzytkownicy_boxy(id_uzytkownicy, id_boxy, id_prezentu,id)
4 prezenty
To nie było by problemów z zapytaniami i ilością boxów.


tadeurz
Przypuszczam, że niechcący pomyliłeś się w zapisie. Masz 100% racje wprowadzenie jeszcze jednej tabeli pośredniczącej pomiędzy USER<->BOX rozwiąże problem z zapytaniem.

Poprawiona struktura:
  1. USER -> id
  2. BOX -> id, GIFT.id
  3. USER_BOX -> USER.id, BOX.id
  4. GIFT ->id


Takie rozwiązanie bardzo szybko namnoży nam wierszy w tabelach. Dla 1 użytkownika musimy utworzyć 100 wierszy w BOX i USER_BOX.
Mam przeczucie, że to jest PODRĘCZNIKOWE rozwiązaniem mojego problemu (problemu który przy tym rozwiązaniu nie istnieje). Ale jakoś nie jestem przekonany, zostanę przy 2 SELECT.

Nie chce zamykać tematu, dlatego jak ktoś miał podobny problem i rozwiązał go jakoś inaczej niż 2 SELECT to śmiało. Osobiście czekam na odpowiedź nospor'a.
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.