Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ [MySQL][PHP] Kilka tabel + LIKE - połączenie tabel

Napisany przez: denis95x 3.12.2019, 23:10:58

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

Napisany przez: nospor 4.12.2019, 09:41:45

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

Napisany przez: denis95x 4.12.2019, 11:05:45

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 ? ;/

Napisany przez: nospor 4.12.2019, 11:13:52

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

Napisany przez: denis95x 4.12.2019, 11:25:03

TABELA rodzaje_uprawnienia

  1. usunięte



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

Napisany przez: nospor 4.12.2019, 11:44:53

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

Napisany przez: denis95x 4.12.2019, 11:49:43

INDEKSY mam tylko na id smile.gif

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


Napisany przez: nospor 4.12.2019, 11:55:37

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

Napisany przez: denis95x 4.12.2019, 12:00:57

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 ?

Napisany przez: nospor 4.12.2019, 12:06:34

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.

Napisany przez: denis95x 4.12.2019, 14:40:21

Kombinuję na różne sposoby

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

Napisany przez: nospor 4.12.2019, 14:46:16

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?

Napisany przez: denis95x 4.12.2019, 15:00:00

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...

Napisany przez: nospor 4.12.2019, 15:04:16

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

Napisany przez: denis95x 4.12.2019, 15:12:47

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). :/

Napisany przez: nospor 4.12.2019, 15:34:49

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?

Napisany przez: denis95x 4.12.2019, 15:47:51

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

Napisany przez: nospor 4.12.2019, 16:04:12

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?

Napisany przez: denis95x 4.12.2019, 16:06:48

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.

Napisany przez: nospor 4.12.2019, 16:09:20

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

Napisany przez: denis95x 4.12.2019, 16:16:10

Chyba nie do konca sie rozumiemy w pełni :/

Jak moge wrzucic osoby ktore sa uczestnikami zadania do tabeli pokaz ?


Napisany przez: nospor 4.12.2019, 16:22:12

A nie mozesz poprostu zrobic jednej tabeli:

ZADANIE_USER
z polami
ID_ZADANIA
ID_USER
ROLE

Pole ROLE z wartosciami
1 - moze widziec
2 - jest przypisany

I juz?

Napisany przez: denis95x 4.12.2019, 16:28:16

Cytat(nospor @ 4.12.2019, 16:22:12 ) *
A nie mozesz poprostu zrobic jednej tabeli:

ZADANIE_USER
z polami
ID_ZADANIA
ID_USER
ROLE

Pole ROLE z wartosciami
1 - moze widziec
2 - jest przypisany

I juz?



Nie, nie mogę, ponieważ czy może widzieć czy nie jest uzaleznione jeszcze od rodzaju danego zadania (czy ma dostep czy nie).
Np. dla rodzaju OFERTA - ma dostęp, a dla WYCENA - nie ma dostępu.

Do teraz wszystko było OK, jesli był tylko 1 user. Działało bez najmniejszych problemów.

tak jak mówię mam tylko problem, żeby dołączyć kilku userów... :/

Napisany przez: nospor 4.12.2019, 16:48:23

No dobrze, ale ja ci nie kazalem kasowac tabeli rodzaj_uprawnienia, tylko polaczyc tamte 2 wczesniejsze ze soba.

Napisany przez: denis95x 4.12.2019, 17:04:48

Cytat(nospor @ 4.12.2019, 16:48:23 ) *
No dobrze, ale ja ci nie kazalem kasowac tabeli rodzaj_uprawnienia, tylko polaczyc tamte 2 wczesniejsze ze soba.


Nie rozumiesz, że się nie da ?

A masz jakiś inny pomysł jak dołączyć tutaj tylko tą tabelę zadania_users questionmark.gif

Napisany przez: nospor 4.12.2019, 17:09:00

Wybacz, wiele rzeczy na glowie, nie jestem w stanie sie skupic w 100% na tobie i niestety nie rozumiem, ze sie nie da. Dla mnie, twoja struktura obecna jest zla. A gdy wydaje mi sie, ze struktura jest zla, to nie mam zupelnie zapalu by marnowac czas na poprawe zapytan.

Napisany przez: denis95x 5.12.2019, 09:51:32

moim zdaniem jest OK, tylko nie wiesz ile tabel jest niezależnych od siebie, a zależne sa tylko w tym momencie (opisywanym wyżej).
Nie możemy tego wcisnąć do 1 tabeli .

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)