![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 375 Pomógł: 20 Dołączył: 28.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Dodaję obsługę słów kluczowych. Z mapą/listą tagów nie ma problemu, ale schody zaczynają się, gdy chcę wyświetlić elementy, które mają przypisane konkretny tag.
Uzyskam TYP oraz ID elementów, ale brakuje tytułu, kategorii i ewentualnie opisu. Pewnie powiecie - JOIN załatwi sprawę. Istnieje 5 typów elementów (albo więcej), każdy ma swoją własną tabelę, np. arts, files, news... Czy da się łączyć tabele wg warunku - na przykład gdy TYPE=1, łączymy z "arts"? W SQLite próbowałem CASE, ale wyskakuje błąd. Nie sprawdzałem w MySQL. Ewentualnie: jazda 5 zapytań albo zastosuj UNION. Dodatkowo trzeba sprawdzić, czy element jest włączony oraz czy kategoria, do której należy element, jest włączona (w osobnej tabeli cats, a więc dodatkowy JOIN jest nieunikniony). Ze względu na tak skomplikowane operacje warto tworzyć CACHE, jednak liczę na sugestie związane z powyższym. Ten post edytował WebCM 26.02.2010, 22:33:43 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 640 Pomógł: 44 Dołączył: 8.02.2004 Ostrzeżenie: (0%) ![]() ![]() |
Napisz zapytanie oparte o UNION ALL i zobacz jak szybko się wykonuje przy realistycznych ilościach danych. Jeżeli zapytanie miałoby być wykonywane często (np. przy wyświetlaniu jakiejś podstrony), a jego wynik nie zmieniałby się za często to oczywiście można wynik jakoś keszować - czy to przez plik, czy przez tabelę w bazie danych zawierającą bardziej wynikowe dane.
Ja generuję listę "co nowego", która na podstawie UNION ALL pobiera ostatnie rekordu z wielu tabel (newsy, artykuły, posty, katalog projektów, katalog prezentacji) i sortuje to po dacie dodania (wszystko ją ma) i mam gotową ładną listę. Zapytanie wykonuje się przy zapisie obiektu do jednej z powyższych tabel i ląduje gotowiec w bazie danych w oddzielnej tabeli na takie feedy dla poszczególnych serwisów (a operacje zapisu nie są częste). SQLka mniej więcej taka, pod SQLite: Kod SELECT
'content', auth_user.username, date, title, description, is_update, changes, slug, content_type, author_id, Null, Null, Null FROM rk_content$sid JOIN auth_user ON author_id = auth_user.id WHERE slug != 'index' UNION ALL SELECT 'injector', auth_user.username, date, title, description, Null, Null, slug, Null, user_id, source, Null, Null FROM feed_injector_injector JOIN auth_user ON user_id = auth_user.id WHERE $inject_col = 1 UNION ALL SELECT 'media', 'riklaunim', date, title, description, Null, Null, denormalised_title, Null, 1, media_type, Null, Null FROM rk_media$sid WHERE accepted = 1 UNION ALL SELECT 'post', rk_post$sid.author, rk_post$sid.date, rk_topic$sid.name, rk_post$sid.text, rk_topic$sid.posts, is_locked, rk_topic$sid.last_pagination_page, rk_post$sid.topic_id, rk_topic$sid.is_solved, rk_topic$sid.is_external, rk_post$sid.author_anonymous, rk_post$sid.author_system_id FROM rk_post$sid JOIN rk_topic$sid ON rk_post$sid.topic_id = rk_topic$sid.id ORDER BY date DESC LIMIT 12 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 13:55 |