![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 124 Pomógł: 1 Dołączył: 13.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam takie zapytanie:
Służy do wylistowania / wyszukania artykułów dla danej kategorii. Dodatkowo zwraca mi dodatkowe informacje o dodającym oraz o osobie, która jako ostatnia edytowała artykuł (edytować może autor lub administrator), m.in to czy dodający lub ostatni edytujący jest administratorem, czy też zwykłym użytkownikiem. Oczywiście zamiast tego zera przy limicie pojawia się odpowiedni offset (IMG:style_emoticons/default/winksmiley.jpg) Dla testu dodałem ok. 1000 artykułów do bazy. Niestety zapytanie zbyt długo się wykonuje, a i tak testuję to tylko na localhoście. Czas więc zoptymalizować składnię zapytania o ile się da no i dodać indeksy. Tabela artykułów:
Pole member_username w tabeli members:
I pytanie tak na marginesie - stosować słówko AS w zapytaniach czy lepiej skrócony zapis bez tego słowa kluczowego? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 124 Pomógł: 1 Dołączył: 13.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ok dzięki Mchl.
Złączenia już wykorzystywałem kilka razy, jednak w tym wypadku nie udawało mi się uzyskać pożądanych efektów więc tymczasowo zastosowałem podzapytania. Co prawda musiałem zmienić w Twoim zapytaniu INNER JOIN-y na LEFT JOIN-y bo nie dostawałem wyników, ale teraz już jest OK. Tak w ogóle to masz literówkę w: Cytat alc.member.level Cytat("gothye") skoro wyszukujesz po
to czemu tutaj klucza nie zastosowałeś ? Bo kategorii będzie bardzo niewiele, na początku ok. 15, maksymalnie myślę, że około 30. Mam jeszcze jeden mały problem. W menu mam wylistowane kategorie i chcę by obok każdej w nawiasie pokazało ile przypada widocznych artykułów dla danej kategorii. O tym czy artykuł jest widoczny decyduje jego status z zakresu od 0 do 6. Widoczne są tylko te ze statusem od 0 do 2 lub ze statusem 6. Kategorie też mają swoje statusy, ale tylko od 0 do 3 i widoczne są wszystkie ze statusem mniejszym niż 3. Tabela kategorii:
Na razie najlepsze zapytanie jakie udało mi się wymyślić ma taką postać:
Dla ok. 1000 artykułów zapytanie wykonuje się średnio w 0.45 s, czyli chyba za długo. Indeksów chyba nie ma sensu zakładać na pola id i status prawda? Jak sami widzicie zapytanie mocno kombinowane :/ Zapytanie musi mi zwrócić również kategorie nieposiadające artykułów (0 w nawiasie). Ten post edytował Walian 20.02.2010, 22:32:54 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Bo kategorii będzie bardzo niewiele, na początku ok. 15, maksymalnie myślę, że około 30. No to co? Ważne po ile będzie artykułów w każdej kategorii. Spróbuj tak: Kod SELECT
ac.category_id, ac.category_status, ac.category_name, ac.category_title, a.articles_count FROM articles_categories AS `ac` LEFT JOIN ( SELECT article_category_id COUNT(*) AS articles_count FROM articles AS `a` WHERE (a.article_status < 3) OR (a.article_status = 6) GROUP BY article_category_id ) AS a ON (a.article_category_id=ac.category_id) WHERE (ac.category_status < 3) Ten post edytował Mchl 20.02.2010, 22:48:14 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 17:12 |