|
|
phpBB2 by Przemo
Support forów phpBB2 modified by Przemo
|
|
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ł
[ 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 |
|
|
|
 |
|
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
|
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 | |
 |
|