Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> JOIN - poprawa zapytania, Po zmianie zapytania brak pewnych danych w wyniku
damianooo
post 6.01.2018, 15:23:43
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Witam,

Potrzebuję do poniższego SELECTa dodać dodatkowe złączenie:
  1. SELECT
  2. t.meet_id,
  3. t.host_type AS hostType,
  4. t.guest_type AS guestType,
  5. u.username AS username,
  6. u.shortname
  7. FROM user u
  8. LEFT JOIN type t ON t.user_id = u.id
  9. WHERE u.STATUS = 1
  10. ORDER BY u.id


Powyższy SELECT zwraca mi 73 rekordy gdzie 3 z nich dzięki złączeniu LEFT JOIN pokazują wartość NULL (co jest równoznaczne z tym że trzech użytkowników nie podało swoich typów) .

Niestety po dodaniu nowego złączenia wyświetla mi tylko 70 rekordów bez tych 3 z NULLem , które bardzo potrzebuję w tym wypadku.

Nowy SELECT:

  1. SELECT
  2. m.matchday_id,
  3. t.meet_id,
  4. t.host_type AS hostType,
  5. t.guest_type AS guestType,
  6. u.username AS username,
  7. u.shortname
  8. FROM user u
  9. LEFT JOIN type t ON t.user_id = u.id
  10. LEFT JOIN meet m ON t.meet_id = m.id
  11. WHERE u.STATUS = 1 AND m.matchday_id = 1
  12. ORDER BY u.id


PS. Tabela User jest połaczona po ID z tabelą TYPE a tabela TYPE jest połączona z tabelę MEET.

Próbowałem z INNER JOIN , RIGHT JOIN i samym JOIN i niestety nie działa sad.gif

zauważyłem że powodem jest to że w klauzuli WHERE dodałem to:
m.matchday_id = 1

to już pewnie zmienia wiele w zapytaniu niestety bo Ci z NULLem odpadają od razu jeśli w tabeli MEET pozycja matchday jest równa 1 .

Ehh pewnie tego nie przeskoczę ...

Ten post edytował damianooo 6.01.2018, 15:17:10
Go to the top of the page
+Quote Post
trueblue
post 6.01.2018, 15:24:32
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. LEFT JOIN meet m ON t.meet_id = m.id AND m.matchday_id = 1
  2. WHERE u.STATUS = 1


--------------------
Go to the top of the page
+Quote Post
damianooo
post 6.01.2018, 16:41:44
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


lepiej ale dalej to nie to

niestety dla matchday = 2 wyświetla mi 73 rekordy z NULL a powinien 0 (zero) ponieważ nikt nie typował w kolejce drugiej , więc nie może tak być.

zmieniłem na INNER JOIN to drugie złączenie ale teraz znowu dostaję 70 rekordów ... ehh ... sad.gif

mam tak :

  1. SELECT
  2. m.matchday_id,
  3. t.meet_id,
  4. t.host_type AS hostType,
  5. t.guest_type AS guestType,
  6. u.username AS username,
  7. u.shortname
  8. FROM user u
  9. LEFT JOIN type t ON t.user_id = u.id
  10. INNER JOIN meet m ON t.meet_id = m.id AND m.matchday_id = 1
  11. WHERE u.STATUS = 1
  12. ORDER BY u.id


Ten post edytował damianooo 6.01.2018, 18:04:27
Go to the top of the page
+Quote Post
emillo91
post 7.01.2018, 06:56:11
Post #4





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

Ostrzeżenie: (0%)
-----


A sprubój dodać do tego watunek "or" dla kolumny z nullem
Go to the top of the page
+Quote Post
trueblue
post 7.01.2018, 08:54:04
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zdecyduj się co chcesz osiągnąć.
W przypadku match_day=1 chciałeś mieć 73 rekordy, aby wiedzieć 70 typujących i 3 nietypujących.
Gdy podstawiasz match_day=2 otrzymujesz znów 73 rekordy, w tym 73 nietypujących.
Chcesz mieć 0 dla match_day=2, to złącz poprzez INNER JOIN, ale w tym przypadku otrzymasz 70 dla match_day=1.


--------------------
Go to the top of the page
+Quote Post
damianooo
post 7.01.2018, 16:58:53
Post #6





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Sytuacja jest prosta - chcę aby po wybraniu w GUI aplikacji przez użytkownika wybranej kolejki pokazały się wszystkie typy użytkowników. Dodatkowo przy użytkownikach co nie wytypowali ma się pojawić jakiś znak więc muszę wiedzieć którzy to byli.

Wydaje się więc że sprawa prosta ale jak widać nie.

Zastanawiam się czy mam dobrze zaprojektowaną bazę danych. Mam tak:

tabela USER,
tabela TYPE (typ) ; pola m.in.: meet_id
tabela MEET(spotkanie/mecz) ; pola m.in: matchday_id
tabela MATCHDAY (kolejka meczy)

Być może tabelę TYPE też powinienem mieć złączoną z tabelą MATCHDAY i wtedy problem by zniknął ? ,Tylko wydawało mi się że pod względem optymalizacji/normalizacji bazy nie było sensu łączyć skoro z MATCHDAY jest już złączona tabela MEET.

emillo91 , w którym miejscu ten OR ?

Ten post edytował damianooo 7.01.2018, 16:59:29
Go to the top of the page
+Quote Post
trueblue
post 7.01.2018, 17:16:48
Post #7





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


No to skoro dla match_day=2 otrzymujesz 73 rekordy i wszystkie NULL, to masz dokładnie listę użytkowników, którzy nie wytypowali.
Przecież właśnie chcesz, a przynajmniej powinieneś chcieć taki wynik, bo napisałeś:
Cytat
Dodatkowo przy użytkownikach co nie wytypowali ma się pojawić jakiś znak więc muszę wiedzieć którzy to byli.


--------------------
Go to the top of the page
+Quote Post
damianooo
post 7.01.2018, 20:01:58
Post #8





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Problem w tym że na GUI wyświetlane się tylko typy wybranej kolejki - a nie wszystkie.

Próbuję to przerobić dalej w PHP ale kłopot mam w pętli w której łączę listę meczy z listą typów bo za dużo wychodzi mi pól z "-" co oznacza brak typu.
Jak nikt nie wytypował w danej kolejce to chcę aby przy każdym był znak "-" .

  1. foreach($meets as $meet){
  2. foreach ($usersTypes as $types){
  3. if($types['matchday_id'] != NULL){
  4. if($meet['meet_id'] == $types['meet_id']) {
  5. $result[$types['meet_id']]['types'][] = $types['hostType'].' - '.$types['guestType'];
  6. }
  7. }else{
  8. $result[$meet['meet_id']]['types'][] = '-';
  9. }
  10. }
  11. $result[$meet['meet_id']]['meet_id'] = $meet['meet_id'];
  12. $result[$meet['meet_id']]['host'] = $meet['host'];
  13. $result[$meet['meet_id']]['guest'] = $meet['guest'];
  14. }


Obecnie zapytanie mam takie:

  1. SELECT
  2. m.matchday_id,
  3. t.meet_id,
  4. t.host_type AS hostType,
  5. t.guest_type AS guestType,
  6. u.username AS username,
  7. u.shortname
  8. FROM user u
  9. LEFT JOIN type t ON t.user_id = u.id
  10. LEFT JOIN meet m ON t.meet_id = m.id AND m.matchday_id = 2
  11. WHERE u.STATUS = 1
  12. ORDER BY u.id


zwracam mi 73 dla matchday_id = 1 i 73 dla matchday_id = 2




Ten post edytował damianooo 7.01.2018, 20:03:58
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 13:27