phpBB2 by Przemo
Support forów phpBB2 modified by Przemo

FAQFAQ - PIERWSZA POMOC!!  regulaminREGULAMIN  SzukajSZUKAJ  UżytkownicyUżytkownicy  GrupyGrupy  StatystykiStatystyki
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload  katalog Forów DyskusyjnychKatalog Forów   FAQ Video tutoriale

Poprzedni temat «» Następny temat
Zamknięty przez: Boltex
03-05-2013, 09:43
Ułożenie zapytania do bazy MySQL
Autor Wiadomość
Sebxx

Posty: 72
Wysłany: 30-04-2013, 15:59   Ułożenie zapytania do bazy MySQL

Witajcie.
Potrzebuję pomocy z zapytaniem do bazy. Otóż sprawa jest dość skomplikowana. W jednej bazie danych mam dwie tabele. Z każdej z nich muszę pobrać kilka informacji i potem zestawić je ze sobą, a następnie wybrać tą wartość, która stanowi część wspólną obu zbiorów. Już wyjaśniam:

1. Tabela #1:
- w niej znajdują się nicki userów, ich ID oraz uprawnienia dostępu
- trzeba z niej wybrać ID wszystkich userów zapytaniem z warunkiem, w którym podany będzie nick i uprawnienie (będą się powtarzać w bazie, każdy ma swoje ID)

2. Tabela #2:
- tutaj znajduje się ID usera, ID serwera do którego dany user jest przypisany i rodzaj (vip/admin)
- trzeba z niej wybrać ID wszystkich userów zapytaniem z warunkiem, w którym będzie podane ID serwera i rodzaj.

Jednym słowem mówiąc z pierwszej tabeli dostanę kilka numerów ID, z drugiej tabeli też dostanę kilka numerów ID i teraz muszę porónać te dwa zbiory i zrobić tak, aby końcowy wynik zapytania zawierał ID usera, o którego chodzi. Prawidłowo zrobione zapytanie i prawidłowo dodany user do bazy (moja w tym głowa ;) ) zawsze zwróci jedno ID. Problem polega na tym że od paru godzin próbuję ułożyć właściwe zapytanie i za każdym razem coś jest źle... Mogę prosić o ułożenie wzorcowego zapytania ?
 
     
Gadatliwa Kasia 

   
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 30-04-2013, 18:37   

Kod:
SELECT u.user_id
FROM tabela_uprawnienia u
JOIN tabela_servery s ON (s.user_id = u.user_id AND s.rodzaj = 'vip')
WHERE u.username = 'nick' AND u.uprawnienie = 'jakieś uprawnienie'

Jeśli użytkownik może mieć więcej niż jeden serwer danego rodzaju to masz relację "wiele do wielu" i będzie zwracać ilość wierszy równą iloczynowi wyników z dwóch tabel. Potrzebna byłaby inna struktura bazy (dodatkowa tabela, ale jaka konkretnie nie napiszę, bo musiałbym wiedzieć coś więcej o "uprawnieniach").
Z kolei jeśli jeden serwer jest przypisany jednemu użytkownikowi to rozumiem, że "rodzaj" służy tylko sprawdzeniu czy uprawnienia są adekwatne do rodzaju serwera.
 
     
Sebxx

Posty: 72
Wysłany: 30-04-2013, 21:30   

Tutaj chodzi o skrypt sklepu zintegrowany z amxbans.

Dany user może być wpisany kilka razy do bazy danych (tabela z userami i uprawnieniami). Będzie miał ten sam nick i uprawnienia, ale dla każdego będzie inne ID. W tabeli z serwerami (ta druga) będą np 4 serwery, każdy o swoim ID i do każdego wpisu będzie przyporządkowane ID innego usera (id serwera może się powtarzać).

Trudno mi to wyjaśnić więc zamieszczę screeny z bazy danych (załączniki). Mam nadzieję że to pomoże. Z pierwszej tabeli wyciągnę ID wszystkich userów, którym będzie odpowiadał podany nick i uprawnienie (te dwa ostatnie pola, nick LOLek i access t), a z drugiej tabeli wyciągnę ID wszystkich userów którzy będą mieli custom_flags vip i ID serwera np 12). Po zestawieniu tych dwóch zbiorów powinienem dostać tylko jedno ID (to właściwe), bo każdy user wpisany do pierwszej tabeli będzie miał tylko jedno uprawnienie, a co za tym idzie będzie w drugiej tabeli albo vipem albo adminem (pole custom_flags). I teraz trzeba by to zrobić jednym zapytaniem.

tabela#2.png
Plik ściągnięto 146 raz(y) 92,36 KB

Ostatnio zmieniony przez Tommekk80 01-05-2013, 06:31, w całości zmieniany 1 raz  
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 01-05-2013, 02:26   

Ok. Nie zauważyłem, że podajesz też ID serwera w warunku - to by w zasadzie by wystarczyło, bo access i custom_flags już niczego nie zmienią (co najwyżej spowodują, że zwróci pusty wynik jeśli podasz nie pasujące).
Kod:
SELECT adm.id FORM amx_amxamxadmins adm
JOIN amx_admins_servers srv ON (srv.user_id = adm.id AND srv.server_id = 15 AND srv.custom_flags = 'vip')
WHERE adm.nickname = 'LOLek' AND adm.access = 't'
bez niepotrzebnych parametrów:
Kod:
SELECT adm.id FORM amx_amxamxadmins adm
JOIN amx_admins_servers srv ON (srv.user_id = adm.id AND srv.server_id = 15)
WHERE adm.nickname = 'LOLek'
Nadal jednak uważam, że ta struktura bazy jest słaba. Niepotrzebnie dublowane są rekordy tych samych użytkowników ze względu na dane, które powinny być przypisane serwerom - najlepiej chyba rozbić to na trzy tabele, chyba, że ta trzecia gdzieś jest, a może pierwsza też (a te które podajesz są "łączącymi"?):
1. użytkowników (user_id, username, ...inne dane usera) - jeden rekord na usera
2. server_admins (user_id, server_id, uprawnienia, custom_flags), która łączy danego użytkownika z wieloma serwerami i dany server z wieloma użytkownikami.
3. tabela serwerów (server_id, server name...)
Dużo większa swoboda zapytań i siła indeksów.

Ps. screen z widocznymi hashami haseł to nigdy nie jest dobry pomysł :roll:

[ Komentarz dodany przez: Tommekk80: 01-05-2013, 07:31 ]
screena wywaliłem
 
     
Sebxx

Posty: 72
Wysłany: 01-05-2013, 15:34   

Z samym screenem nic nie zrobisz ;)

Struktury bazy nie mam jak zmienić bo ja piszę mały skrypt do dodawania userów do innego, dużego skryptu (AMXBans). Tylko te dwie tabele zawierają informacje o userach.

Wypróbowałem oba zapytania i żadne z nich nie zwraca mi ID usera. Dokładniej to użyłem takiego zapytania:

Kod:

SELECT adm.id FORM amx_amxadmins adm JOIN amx_admins_servers srv ON (srv.admin_id = adm.id AND srv.server_id = 12) WHERE adm.nickname = 'LOLek' AND adm.access = t


Musi być określony access (w przypadku vipa jest to t) bo po tym zapytanie ma odróżnić vipa od admina.
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 01-05-2013, 16:04   

Po pierwsze t w cudzysłów. Po drugie jeżeli zapytanie zwraca pusty wynik to znaczy, że przykładowy 'LOLek' nie ma serwera o server_id = 12 albo (dodając dodatkowe parametry) ma na nim inne uprawnienia. Jeżeli chcesz operować na takiej strukturze i wygląda ona tak jak to przedstawiasz (nie ma innych tabel userów) to temat jest wyczerpany.
 
     
Sebxx

Posty: 72
Wysłany: 01-05-2013, 16:38   

Ech.. Dalej nic. Może na początek zamieszczę cały kod PHP na jakim to testuję:

Kod:

<?php
$sql_conn = mysql_connect('host', 'user', 'pass');
mysql_select_db('baza_amxbans');
//
$tab = mysql_query("SELECT adm.id FORM amx_amxadmins adm JOIN amx_admins_servers srv ON (srv.admin_id = adm.id AND srv.server_id = '12') WHERE adm.nickname = 'LOLek' AND adm.access = 't'");
    echo 'ID Admina = '.$tab.'';
//
mysql_close($sql_conn);
?>


host, user, pass i baza są oczywiście podane ;)

I teraz tak. W tabeli amx_amxadmins mam wpisanego LOLka' dwa razy (tak samo). Różnią się tylko ID (jeden ma 51, a drugi 52 i obaj maja access = t). W tabeli amx_admins_servers jeden z nich jest przypisany do serwera o ID=12, a drugi do serwera o ID=13. I teraz znając nick, access i ID serwera musze wyciągnąć za pomocą zapytania ID właściwego usera. Może to lepiej wyjaśnia sytuację ?

[ Dodano: 01-05-2013, 19:29 ]
//EDIT:
Zmiana planów. Rozgryzłem jak działa oryginalne zapisywanie i edycja adminów przez amxbans. Chyba prościej będzie dodać w bazie jeszcze jedną tabele (zbiorczą) do której będą zapisywały się dane o każdym dodanym adminie/vipie i z tej tabeli mój sklepik będzie pobierał informacje, przetwarzał je i dopiero potem zapisywał każdą z przetworzonych informacji w odpowiednie miejsce w tych dwóch nieszczęsnych tabelach. To chyba będzie najlepszy i najprostszy sposób.

Jeśli można to prosiłbym o niekasowanie na razie tematu, może będę jeszcze potrzebował pomocy ;)
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 01-05-2013, 18:58   

A może problem tkwi w tym, że nie pobierasz wyników zapytania tylko id wyniku za pomocą którego dopiero pobierzesz przygotowane dane (teraz powinno ci wyskakiwać coś w rodzaju "ID Admina = Resource id#3" - jeżeli nic nie wyskakuje to wynik jest pusty czyli 'false'). Pobaw się tym zapytaniem w phpMyAdmin najpierw, a w skrypcie zamiast
Kod:
echo 'ID Admina = '.$tab.'';
Powinieneś wpisywać:
Kod:
$wynik = mysql_fetch_assoc($tab);
echo  'ID Admina = ' . $wynik['id'];
 
     
Sebxx

Posty: 72
Wysłany: 01-05-2013, 21:05   

Wcześniej zwracał mi ID Admina = Resource id#2
Co to oznacza ?
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 01-05-2013, 22:37   

Sebxx napisał/a:
Co to oznacza ?
Że nie umiesz czytać.
 
     
Sebxx

Posty: 72
Wysłany: 02-05-2013, 12:52   

Ucze sie, spokojnie :) (znaczy nie czytać tylko php ;) )

Na chwile obecną próbuje tej drugiej metody z dodaniem dodatkowej tabeli do bazy i modyfikacji skryptu. Mam takie pytanie, można zrobić zapytanie INSERT INTO z warunkiem ? Bo nie moge znaleźć żadnego przykładu na takie konkretne zapytanie, a strona zwraca mi błąd.

Otóż chciałem zrobić coś takiego:
Kod:

mysql_query("INSERT INTO `amx_allinfo` (`server_id`,`static_bantime`) VALUES ('".$v."','".$sban."') WHERE `user_id`='".$adminid."'") or die (mysql_error());


Chodzi o to żeby wpisał dane w pola server_id i static_bantime dla usera o ID=$adminid
Może to się jakoś inaczej zapisuje ?
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 02-05-2013, 15:34   

Sebxx napisał/a:
Ucze sie, spokojnie
O to dobrze, bo w takim wypadku nie jest wskazane, aby każdy twój problem rozwiązywał ktoś inny.
 
     
Sebxx

Posty: 72
Wysłany: 02-05-2013, 16:09   

Ja tylko pytam o pomoc :) Nie każę Ci robić gotowca.
 
     
MQs

Pomógł: 172 razy
Posty: 480
Wysłany: 02-05-2013, 16:51   

Jest różnica między pomaganiem z problemem a pomaganiem w nauce - to nie jest szkoła. Twoje problemy wynikają z tego, że robisz coś czego jeszcze nie umiesz, a nie z tego, że napotkałeś jakieś trudności. Opisy instrukcji MySQLa nie znajdują się przecież na tajnych stronach Pentagonu, a nawet są łatwo odnajdywane przez google. Z wyszukiwarki chyba umiesz korzystać?
 
     
Gadatliwa Kasia 

   
kevin_


Pomógł: 768 razy
Posty: 2680
Wysłany: 02-05-2013, 18:33   

Nie spotkałem się, aby INSERT wspierał WHERE.
Kod:

mysql_query("INSERT INTO `amx_allinfo` (`server_id`,`static_bantime`) VALUES ('".$v."','".$sban."') WHERE `user_id`='".$adminid."'") or die (mysql_error());

na
Kod:

mysql_query("INSERT INTO `amx_allinfo` (`server_id`,`static_bantime`, `user_id`) VALUES ('".$v."','".$sban."', '{$adminid}')") or die (mysql_error());


Nie znam struktury Twojej tabeli amx_allinfo, ale jeśli chcesz zapisać server_id + static_bantime dla danego użytkownika do insertuj również jego ID. Zobacz mój przykład a Twój.
_________________
Prezes :mrgreen:
 
     
Wyświetl posty z ostatnich:   
Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Kopiowanie wszelkich treści zawartych na forum, modyfikacji oraz instrukcji bez zgody administracji i autorów tematów/postów zabronione!

Powered by phpBB modified by Przemo © 2003 phpBB
Strona wygenerowana w 0,13 sekundy. Zapytań do SQL: 15
Polecane serwisy

Najlepsze oprogramowanie do prowadzenia sklepu internetowegoNajlepszy program do sklepu firmowany przez Przem'a

Sklep z gadżetami

serwis laptopów

phpbb

Design Cart - Tworzenie sklepu internetowego

iRonin.IT

• Zamów reklamę