![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam tabele: id | atrakcja ========== 1 | aaaa 2 | bbbb id | dom ====== 1 | Basia 2 | Gosia 3 | Zosia dom_id | atrakcja_id ============== 1 | 1 1 | 2 2 | 2 3 | 1 I jak wyświetlić nazwy domów dla których atrakcja_id przyjmuje wartość zarówno 1 jak i 2 (czyli w naszym przypadku zwroci tylko dom Basia) ? |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
zakładając, że twoje tabelki to: `domy`, `atrakcje` i `domy_atrakcje`:
-------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 78 Pomógł: 15 Dołączył: 10.12.2007 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Nie dokładnie - zabrakło wyboru konkretnych atrakcji - przy większej liczbie atrakcji, wybierałoby jakikolwiek dom, który ma 2 lub więcej różnych atrakcji.
zakładając tabele: `domy` (pola: `dom_id`, `dom`), `atrakcje` (pola: `atrakcja_id`, `atrakcja`), `domy_atrakcje` (pola: `dom_id`, `atrakcja_id`)
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Chyba się źle zrozumieliśmy nevt. Twój kod wyrzuca mi wszystkie nazwy domów w bazie. A nie o to chodziło.
pest - dzięki. Działa. Ten post edytował parzol 4.03.2008, 10:59:50 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
Cytat Twój kod wyrzuca mi wszystkie nazwy domów w bazie. A nie o to chodziło. NIEMOŻLIWE - sprawdzałem. Pokaż, dane źródłowe, pokaż wyniki i pokaż jakiem naprawdę kodem się posłużyłeś ? -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Pest ci odpisał dlaczego to jest źle.
Jeszcze jedno pytanie. Bo kiedy dałem samo zapytanie wszystko działało pięknie. Ale teraz muszę to podczepić pod istniejące większe zapytanie. Wygląda to tak:
I oczywiście wywala błąd bo są dwa GROUP BY. Jak to zapisać żeby działało? Kod bez klauzuli WHERE działa i wyrzuca wszystkie obiekty. A ja chce tylko te obiekty gdzie atrakcja ma np. ID = 1 i 9. PS. GROUP BY pa.property_id, room_id nie działa. Ten post edytował parzol 4.03.2008, 15:01:54 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
Cytat Pest ci odpisał dlaczego to jest źle. Nieprawda - Pest wcale nie zakwestionował mojego rozwiązania tylko zaproponował bardziej szczegółowe rozwiązanie. To ty napisałeś że zwraca ci wszystkie rekordy z bazy co jest KŁAMSTWEM gdyż sprawdzałem to zapytanie na strukturze i danych które zamieściłeś w wątku. Co do kolejnego problemu - cóż - poczekajmy na wypowiedź Pesta - po co mam się niepotrzebnie denerwować - powodzenia ![]() Ten post edytował nevt 4.03.2008, 14:43:40 -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Spokojnie bez nerwów
![]() Kod mysql> SELECT p.name FROM property_attraction pa LEFT JOIN property p ON p.id=pa.property_id GROUP BY pa.property_id HAVING COUNT(pa.attraction_id) >1; +---------------------+ | name | +---------------------+ | bella | | Supeeroo Vialnowa | | Relais santa chiara | | La Collegiata | | Palazzo Mannaioni | | Il Borgo La Bagnaia | +---------------------+ 6 rows in set (0.00 sec) Poza tym u ciebie w kodzie nie było chociażby klauzuli mówiącej o wybraniu konkretnych atrakcja_id więc już założenia są niespełnione. Tak czy siak kod pest niezależnie działa tak jak chciałem. Teraz potrzebuje pomocy jak to podpiąć pod to długie zapytanie. Ktoś pomoże? ![]() Ten post edytował parzol 4.03.2008, 17:42:45 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 78 Pomógł: 15 Dołączył: 10.12.2007 Skąd: Lublin Ostrzeżenie: (0%) ![]() ![]() |
Sorki za zamieszanie, nie o to mi chodziło. Oczywiście SQL podany przez nevt był dobry, do tamtych danych, ja go uszczegółowiłem - korzystając z tego co on napisał.
Co do długiego zapytania: Tak jak już pisałem w PM zapytanie jest dość masakryczne, ale skoro wszystko jest potrzebne i taka jest konstrukcja tabel... Lepiej dać kilka enterów do SQL'a, żeby było szybciej i prościej. Nie będę analizował może całej struktury tabel, więc tylko ta zmiana w GROUP BY, jeśli nie będzie działało, to napisz jeszcze (bardzo możliwe, że może być coś jeszcze, nawet jak będzie dawało wyniki, to nie daję głowy, że o takie wyniki ci chodzi). Pozatym, że nie wiem czy w ogóle mogą być 2x GROUP BY do jednego SELECT'a, to jeszcze był jeden problem taki, że `room_id` masz w kilku tabelach i nie podałeś, z której z nich to room_id było.
Ten post edytował pest 4.03.2008, 17:47:10 |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za zainteresowanie. room_id to r.id oczywiście.
Ten kod nic nie wyrzuca. Nie ma błędów tylko po prostu "Empty set", a powinno poprawnie wyrzucić jeden obiekt. ![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Już o tym rozmawialiśmy ale przedstawię mój pomysł na forum. Może komuś się przyda, a może i usłyszę jakieś opinie (za i przeciw).
Witam. Mam tabele: id | atrakcja ========== 1 | aaaa 2 | bbbb id | dom ====== 1 | Basia 2 | Gosia 3 | Zosia dom_id | atrakcja_id ============== 1 | 1 1 | 2 2 | 2 3 | 1 Ja bym zburzył nieco zasady tworzenia baz danych (postacie normalne) i do tabeli z domami dodał kolumnę "attractions", która wyglądałaby dla tego przykładu w ten sposób: Kod id | dom | attractions ======================= 1 | Basia | 1,2 2 | Gosia | 2 3 | Zosia | 1 czyli zawierałaby id atrakcji z tabeli "dom_atrakcja" dla danego domu. Ważne aby id były posortowane (czyli 1,2, a nie 2,1). Później w wyszukiwarce przesyłamy zaznaczone atrakcje w tablicy i łączymy np. implode(',', $_POST['attractions']) do ciągu x,y,z,* po czym możemy sprawdzić, który dom pasuje do zaznaczonych atrakcji poprzez zwykłe LIKE attrations="%$polaczone%". Rozwiązanie wydaje mi się prostsze i wydajniejsze. Kwestia po co tworzyć więc tabelę "dom_atrakcja". Ano po to aby przy wyświetlaniu danego obiektu łatwo (1 proste zapytanie z joinem) wyświetlić jego atrakcje. Czyli z dodatkowej kolumny korzystamy tylko przy wyszukiwaniu, a przy wyświetlaniu szczegółów obiektu korzystamy już z tej "standardowej". Aktualizację pola można robić w PHP ale w sumie chyba lepiej/wygodniej napisać do tego triggera. To mój pomysł ![]() Ten post edytował phpion 7.03.2008, 09:20:40 |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Wspaniały pomysł phpionie
![]() Nowatorsko, odważnie ale nie działa w każdym przypadku ! Nie przewidziałeś drobnej sytuacji kiedy ciąg atrakcji ma postać 1_2_3_9 a ktoś wyszuka według 1_9. Ale to szczegóły. Wystarczy te '_' usunąć (są zbędne a wręcz niepożądane!) i wyszukiwać tak: LIKE("%1%9%"). Jednak za samą idee gratki i wielkie dzięki! ![]() Ten post edytował parzol 7.03.2008, 12:58:42 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Nie przewidziałeś drobnej sytuacji kiedy ciąg atrakcji ma postać 1_2_3_9 a ktoś wyszuka według 1_9. Faktycznie, masz rację - o tym nie pomyślałem :/ Wystarczy te '_' usunąć (są zbędne a wręcz niepożądane!) i wyszukiwać tak: LIKE("%1%9%"). No nie do końca. Taki zapis wyszuka Ci zarówna ciąg 1_9 (czyli to o co Ci chodziło) oraz np. 1_19 (co już będzie błędem). Heh, chyba mój pomysł nie jest taki genialny ![]() |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 135 Pomógł: 1 Dołączył: 7.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
No nie do końca. Taki zapis wyszuka Ci zarówna ciąg 1_9 (czyli to o co Ci chodziło) oraz np. 1_19 (co już będzie błędem). Hmmm fakt. A jakby zapisywać w bazie dane tak: _1_2_9_ i szukać według: LIKE("%_1_2_%_9_%"). ? ![]() Heh, chyba mój pomysł nie jest taki genialny ![]() Nie bądź dla siebie taki surowy ![]() Ten post edytował parzol 7.03.2008, 15:12:28 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 11:19 |