Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Mam tabelkę, z której trzeba wyciagnąć konkretne rekordy (każdy oznaczony unikalnym id). Problem w tym, że tych rekordów może być bardzo dużo i serwerowi może się nie spodobać zapytanie typu
SELECT * FROM tabela WHERE id=1 AND id=2 AND id=5 AND (150 podobnych warunków)
Wysyłanie osobnego zapytania dla każdego rekordu z osobna to też nie jest dobry pomysł. A może się mylę?? Najlepsze rozwiązanie jakie mi przyszło do głowy to podzielenie jednego długiego zapytania na zestaw krótszych (ilość w zależności od potrzeb). Muszę wiedzieć, na jakie części mam dzielić zapytanie. A może są lepsze metody??
takie zapytanie z punkty widzenia logiki jest bez sensu bo zawsze nic nie zwroci!
dane o id musza skads pochodzic wiec najprosciej wrzucic zapytanie w petle a wynik ladowac do arraya.
Do powyższego faktu (błędny operator logiczny), chciałbym dodać, że potrzeba stosowania bardzo długiego zapytania (nie złożonego tylko długiego) jest wynikiem złego zaprojektowania bazy.
Zazwyczaj w jednym zapytaniu wyciąga się dane, które odpowiadają pewnym kryteriom. Skoro chcesz z jednej tabeli wyciągnąć rekordy o podanych ID, tzn., że albo wyciągasz dane nie powiązane ze sobą albo nie wiem co chcesz osiągnąć...
Może da się znaleźć inne zapytanie, które da taki sam wynik? Warto sprawdzić czy nie istnieje jedno kryterium po którym można rozpoznać dane rekordy.
lista rekordów pochodzi z innej tabelki. To wygląda mniej więcej tak: są dwie tabelki przechowujące listę treści. W jednej z nich cidy (Content ID) się powtarzają, bo np. ta sama treść może występować w 2 różnych językach i w każdym nich może mieć np. różne tytuły. Ale takie ustawienia jak uprawnienia (na które składa się kilka informacji) ładuje się już z drugiej tabelki, bo są one wspólne dla każdej treści niezależnie od języka. Puszczenie tego w pętli mi nie do końca odpowiada, bo wtedy wysłałbym do bazy mnóstwo zapytań dla jednego skryptu. A jeśli chodzi o operator logiczny to się pomyliłem. Miało być OR, ale pisałem posta na szybko
Istotnie da się inaczej zaprojektować tabelkę i chyba to tak załatwię, niestety czeka mnie dużo przerabiania programu....
Z tego co wiem pomóc mogą Ci złączenia ale nie jestem w stanie opisać jak ich użyć więc odsyłam do literatury.
Polecam książkę wydawnictwa Helion PHP5 i MySQL. Biblia.
Wrzuć tu kawałek tych tabelek. Może znajdę chwilkę i poszukam rozwiązania.
tabelka CONTENTS:
- id - identyfikator contentu w tabelce
- cid - content ID - jako, że w tej tabelce contenty mogą sie powtarzać (i różnią się językami, a co za tym idzie tytułami, tagami...)
- title - tytuł
- tags - tagi dla wyszukiwarki
- language - język
- mid - ta tabela to jedynie indeks treści, treści same w sobie będą pobierane z tabelek konkretnych modułów, do których treści przynależą; mid określa ID w tych tabelkach
tabelka CONTENTS_SCS (Shared Contents Settings)
- cid - jak wyżej
- module - obsługujący modół
- group1, group2, group3, group4, group5 - grupy, wg których można posortować treści; oczywiscie nie trzeba wykorzystywać wszystkich pięciu, często wystarczy jedna
- uid - User ID
- gid - Group ID
- perm - 3-cyfrowa liczba określająca uprawnienia, podobnie jak ma to miejsce w UNIKSIE; pierwsza liczba określa uprawnienia właściciela, druga grupy użytkowników "posiadających" treść, a trzecia pozostałych użytkowników; 0:nie może nic, 1:może odczytywać,2:moze zapisywać, 3:może wszystko
przykłądowa tebelka contents
id | cid | title | tags | language | mid
1 | 1 |Testowa treść| testowa, tresc | polski | 2
2 | 3 |tresc testowa 2| <puste> | polski | 3
3 | 3 |Test title| <puste> | english | 11
4 | 2 |Test title 2| <puste> | english | 9