Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL][PHP] Kilka tabel + LIKE - połączenie tabel
denis95x
post 3.12.2019, 23:10:58
Post #1





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


Mam problem i nie wiem jak go rozwiązać smile.gif
Liczę na pomoc smile.gif

W 1 tabeli (zadania) mam kolumnę user_wyk w formacie np: [1][2][8][69] etc.... + oczywiscie id usera
w 2 tabeli (zadania_users_pokazuj) mam kolumny id_usera, pokaz, id_usera_save

Wszystko działało jeśli było user_wyk było int -> tylko 1 cyfra smile.gif
Potrzebuję zrobić tam kilka cyfr - kilku userów.

I teraz problem jak zrobić LIKE aby to zadziałało :/

Wyciąg z zapytania
  1. zadania.user_wyk LIKE '%['||zadania_users_pokazuj.id_usera||']%' AND zadania_users_pokazuj.pokaz=1 AND zadania_users_pokazuj.id_usera_save='$user_id'


chodzi dokładnie o ten fragment:
zadania.user_wyk LIKE '%['||zadania_users_pokazuj.id_usera||']%'

Ktoś pomoże?questionmark.gif


__
Edit:

Próbowałem już też przez IN
  1. zadania.user_wyk IN ('[',`zadania_users_pokazuj.id_usera`,']')


ale jak próbuję
zadania_users_pokazuj.id_usera - > NIE DZIAŁA
id_usera -> DZIAŁA ALE NIE O TO CHODZI

Ten post edytował denis95x 3.12.2019, 23:39:58
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 09:41:45
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Problem z php nie ma zadnego zwiazku. Nie widzisz tego? Przenosze

Zacznij od stworzenia poprawnej struktury tabel. Nie zadne pole z wieloma userami, tylko nowa tabela, o polach
ID_ZADANIA
ID_USER

Z taka struktura mozna juz normalnie pracowac


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 11:05:45
Post #3





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


Ok, ale jeśli dodam kolejne połączenie z bazą to mega mi to opóźnia.

Zapytanie i tak jest już dość długie :/

  1. SELECT *
  2. FROM zadania
  3. LEFT JOIN zadania_users ON zadania.nr_zad=zadania_users.nr_zad
  4. LEFT JOIN zadania_users_pokazuj ON zadania_users_pokazuj.id_usera=zadania_users.id_usera
  5. LEFT JOIN rodzaje_uprawnienia ON rodzaje_uprawnienia.id_rodzaj=zadania.rodzaj
  6. WHERE (zadania.STATUS=2 OR zadania.STATUS=3) AND zadania_users_pokazuj.id_usera_save=1042 AND zadania_users_pokazuj.pokaz=1 AND rodzaje_uprawnienia.id_user=1042 AND rodzaje_uprawnienia.dostep=1 AND rodzaje_uprawnienia.filtr_zadania=1
  7. GROUP BY zadania.id


Chyba, że istnieje jakiś sposób na połączenie tego, aby działało szybciej ? ;/

Ten post edytował denis95x 5.12.2019, 09:49:43
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 11:13:52
Post #4





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




1) To nie jest zadne nowe polaczenie z baza, a kolejny JOIN tabeli.
2) To ma byc dolaczone przez (LEFT )JOIN a nie we FROM masz 50 tabel...
3) Pokaz strukture tabel na ktorych operujesz, pokaz indeksy ktore zalozyles
4) Poczytaj o komendzie EXPLAIN w mysql i zacznij uzywac


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 11:25:03
Post #5





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


TABELA rodzaje_uprawnienia
  1. usunięte



Podpowiesz jak to połączyć razem (LEFT )JOIN ?

Ten post edytował denis95x 5.12.2019, 09:48:29
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 11:44:53
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




1) W zapytaniu widze ze korzystasz z 3 tabel, pokazales dwie
2) INT(1) nie ogranicza w zaden sposob pola do 0 i 1. Jak pole bedzie przyjmowac tylko male wartosci to ma byc typu TINYINT. Patrzu manual mysql: TYPY POL
3) Jak uzyc left join? https://dev.mysql.com/doc/refman/8.0/en/join.html

4) Rowniez nie pokazales jakie zalozyles iNDEKSY a prosilem o to


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 11:49:43
Post #7





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


INDEKSY mam tylko na id smile.gif

TINYINT - będzie miało wpływ na szybkość ?



Ten post edytował denis95x 4.12.2019, 12:00:30
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 11:55:37
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Kazda mikrooptymalizacja ma wplyw na szybkosc. Czasami wieksza czasami mniejsza ale ma.
Nie masz indeksow, robisz w ciul warunkow i jeszcze zdziwiony ze dziala wolno


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 12:00:57
Post #9





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


czy jak wyszukuję w zadania_users_pokazuj po wszystkim -> to wszystkie pola mają mieć indeksy ? ohmy.gif

+ dodać indeksy dla pól którę są łączone w zapytaniu? dobrze rozumiem ?
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 12:06:34
Post #10





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




czasami indeksy maja sens czasami nie. Dlatego napisalem, bys zainteresowal sie komenda EXPLAIN, ktora ci ladnie wszystko pokaze jakie indeksy so wykorzystywane, jakie nie itp.

takze popraw zapytanie na JOINy, odpal EXPLAIN i zacznij dodawac indeksy, po kazdym indeksie wal EXPLAIN i bedziesz widzial co dziala a co nie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 14:40:21
Post #11





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


Kombinuję na różne sposoby

efekt -> zamulenie bazy... Coś nie tak...

Ten post edytował denis95x 5.12.2019, 09:46:04
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 14:46:16
Post #12





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Przestan traktowac LICZBY jako TEKSTY - to po pierwsze. Skad wy ten nawyki bierzecie?

Po drugie: raczyles uzyc EXPLAIN jak prosilem? To moze bys pokazal wyniki explain i nam?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 15:00:00
Post #13





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


Zapytanie:
  1. 1 SIMPLE t1 ALL
  2. NULL
  3.  
  4. NULL
  5.  
  6. NULL
  7.  
  8. NULL
  9. 760 USING WHERE; USING TEMPORARY; USING filesort
  10. 1 SIMPLE t2 ALL
  11. NULL
  12.  
  13. NULL
  14.  
  15. NULL
  16.  
  17. NULL
  18. 932 USING WHERE; USING JOIN buffer (flat, BNL JOIN)
  19. 1 SIMPLE zadania_users ALL
  20. NULL
  21.  
  22. NULL
  23.  
  24. NULL
  25.  
  26. NULL
  27. 33743 USING WHERE; USING JOIN buffer (incremental, BNL j...
  28. 1 SIMPLE t3 ALL
  29. NULL
  30.  
  31. NULL
  32.  
  33. NULL
  34.  
  35. NULL
  36. 33857 USING WHERE; USING JOIN buffer (incremental, BNL j...


Ten post edytował denis95x 5.12.2019, 09:45:47
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 15:04:16
Post #14





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No i dobra, i jaki np, sens ma ten warunek
rodzaje_uprawnienia.id_user=1042
?

Moze napisz wpierw slowami, co chcesz osiagnac bo jak dla mnie to sie nie trzyma kupu w tym momencie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 15:12:47
Post #15





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


rodzaje_uprawnienia.id_user=1042

gdzie 1042 - wpisane z ręki ID zalogowanego użytkownika -> w kodzie podstawiam zmienną z PHP

Co chcę osiągnąć?

Więc po kolei.
- mam tabelę zadań - spis treści oraz dane do wykonania zadania
- kolejno sprawdzić chcę w tabeli zadania_users_pokazuj -> jakich użytkowników ma uwzględnić dla zalogowanego usera (czyli pokazać tylko zadania w których występuje użytkownik dla którego jest włączone pokaz=1)
- każde zadanie ma swój rodzaj, stąd powstała tabela rodzaje_uprawnienia -> która ma definiować do jakich rodzajów ma użytkownik dostęp włączony (dostep=1)

Wszystko mi działało OK jeśli miałem tylko 1 usera w zadaniu i był zapisany w tabeli zadania
w momencie jak utworzyłem tabelę zadania_users w celu, aby móc przypisywać kilku userów do tego zadania - zaczęły się problemy i nie wiem jak to razem spiąć (zachowując wszystkie warunki). :/
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 15:34:49
Post #16





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No dobra,troche jasniej teraz

Nie mniej jednak nadal nie rozumiem czemu masz dwie tabele
zadania_users_pokazuj
oraz
zadania_users

Czym one sie roznia?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 15:47:51
Post #17





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


zadania_users_pokazuj -> jest tabela która sprawdza tylko filtrowanie
załóżmy: jestem zalogowany i ma mi pokazać tylko zadania dla osób Kowalski, Nowak, Piątek, Sobota (id -> 1,4,5,7) a dla pozostałych ma nie pokazywać (id -> 2,3,6)
więc:
id 1 -> pokaz=1
id 2 -> pokaz=0
id 3 -> pokaz=0
id 4 -> pokaz=1
id 5 -> pokaz=1
id 6 -> pokaz=0
id 7 -> pokaz=1

Ta tabela tylko ma za zadanie czy ma użytkownika uwzględniać czy nie.

a tabela zadania_users zapisuje numer zadania i id_usera który jest do niego przypisany
czyli np.
nr_zad, id_usera
99_2019, 1
99_2019, 4
99_2019, 6
101_2019, 4

teraz mniej więcej rozumiesz? Myślałem zamiast tabeli zadania_users wpisywać id userów którzy wykonują zadanie po przecinkach w tabeli głównej zadania (np. 1,4,6) -> ale to nie przejdzie smile.gif

Ten post edytował denis95x 5.12.2019, 09:44:40
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 16:04:12
Post #18





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Dalej nie kumam. Czym sie rozni przypisanie zadania od pokazywania zadania?

Czyli zadanie moze widziec zarowno osoba, ktora jest do zadania przypisana oraz osoba, ktora moze je widziec?

No i ta tabela z pokazywaniem nie ma sensu tak czy siak. Jesli ona informuje kto moze widziec, to nie ma sensu dodawac tam rekordy z wartosciami 0. Tam maja byc tyko userzy, ktorzy moga widziec i juz, Po grzyba sztucznie generowac rekordy?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
denis95x
post 4.12.2019, 16:06:48
Post #19





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 21.02.2015
Skąd: Bielsko-Biała

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


Przypisanie zadania od pokazania różni się.

Zadanie może widzieć każdy z użytkowników. (dodatkowo każdy z użytkowników może sam sobie zaznaczyć czy ma teraz wyświetlać zadania dla danego użytkownika czy nie)

Przypisania do zadania - to userzy, którzy mogą zadanie realizować (edytować).

Ci co mogą widzieć zadanie na listach nie koniecznie muszą być do niego przypisani.

Ten post edytował denis95x 4.12.2019, 16:07:41
Go to the top of the page
+Quote Post
nospor
post 4.12.2019, 16:09:20
Post #20





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




No i dobrze, tak czy siak, jak mowilem, wstawianie do pokaz zadanie rekordow z 0 mija sie z celem. Tylko opozniasz zapytania. Tam maja byc tylko rekordy dla osob, ktore moga widziec i juz. I juz pole POKAZ jest wtedy zbedne

Dobrze by bylo, jakbys z automatu do tabli POKAZ wrzucal osoby, ktore sa przypisane do zadania. To by dalo kopa dla zapytania bo wtedy FROM bys robil z tabeli POKAZ z warunkiem na twojego ludzika. I juz petryliard rekordow bys mial z glowy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 28.03.2024 - 18:39