![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 3 Dołączył: 29.12.2008 Skąd: osada koczownika :P Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam pewien problem ze złączeniem typu CROSS JOIN w mysqli, a do tego wynik jest przesyłany do Smarty. Oto moje zapytanie (oczywiście działa i dobrze się ma) Kod SELECT * FROM news CROSS JOIN admin CROSS JOIN kat_news WHERE news.id_login = admin.id ORDER BY news.data AND news.id_kat = kat_news.id AND slider = '0' DESC LIMIT 4 Następnie dane trafiają do SMARTY poprzez: $smarty->assign("news", $news); W pliku .tpl mam Kod {foreach item=news from=$news} <div class="news"> <a class="news" href="nowosc,{$news.id},{$news.tytul|lower|nl2br|strip_tags|replace:' ':'_'}"> <span class="ngnews"> {$news.tytul|nl2br|strip_tags} </span> </a> </div> {/foreach} To także działa - wyniki wyświetlają się poprawnie oprócz małego niuansu. W linku nowosc,IDNEWSA,TYTUL_NEWSA -> zamiast IDNEWSa wyświetla się ID kategorii newsa ze złączenia. Próbowałem modyfikować zapytanie lecz nieskutcznie. Może ktoś ma jakiś lepszy sposób? Proszę o konsultację. (IMG:style_emoticons/default/biggrin.gif) Życzę miłego wieczoru. Pozdrawiam, Robert. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Cross join ma to do siebie, że łączy wszystko ze wszystkim, co w przypadku większych tabel jest niestety zajeżdżaniem bazy. Radziłbym Ci je przerobić, bo i tak zauważ, że limitujesz te dane a na dodatek wyświetlasz tylko kilka rzeczy, więc przerzucanie wszystkich używając gwiazdki w select to dodatkowe obciążanie łącza nadmiarem przesyłanej informacji. Zresztą patrząc na kod jakiekolwiek złączanie z kategorią jest bezsensowne, gdyż nie używasz danych z tej tabeli. Smarty uzywa tylko id i tytuł, a to sugeruje skrócenie zapytania do:
gdzie admin_id to numer id admina gdy masz tylko jednego w bazie. Jeśli jednak masz kilku adminów w serwisie to modyfikujesz nieznacznie całość do:
Nie potrzeba nawet sortowania po dacie newsa, bo automatycznie newsy z najwyższymi id są jednocześnie najświeższymi. A id jest zazwyczaj indeksem w przeciwieństwie do daty, co sprawi, ze zapytanie jest jeszcze szybciej wykonywane. Tak przynajmniej można Twój kod poprawić (IMG:style_emoticons/default/winksmiley.jpg) Bo na co robić tyle niepotrzebnych joinów generujących bezsensownie tyle wierszy, skoro nie musi być żadnego? No chyba, że dołączasz kategorię jeszcze z innych powodów, ale przeanalizuj swój kod, niezbędne zmienne i sam zobaczysz jak wiele nadmiarowych rzeczy robisz niepotrzebnie. Bo przecież choćby w Twoim wypadku przesyłasz teżtreść wszystkich rekordów włącznie z treścią newsa, którego nie wyświetlasz nigdzie. A przesłanie tego między Apachem i MySQL też swój czas zajmie. Nie przesyłaj więc niepotrzebnie danych, których nie używasz. Ale jeśli już jakoś musisz użyć całości jak jest to poczytaj o czymś takim jak ALIAS (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 17:19 |