![]() |
![]() |
![]() ![]()
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 ![]() |
Dla mnie za dużo kombinowania z łączeniami typu CROSS JOIN robisz, gdzie są one tylko spowalniaczem całości skryptu i w takiej sytuacji nie stosuje się ich. Przy takiej strukturze tabel robisz LEFT JOIN po kolumnach łączących i wyciągasz odpowiednie dane. Nazwa tabeli admin była dla mnie myląca i sugerowała, że tylko admin może pisać i dlatego ująłem id_admina jako warunek ograniczający. W takim wypadku zapytanie powinno być:
Takie zapytanie ograniczy już "na dzień dobry" liczbę tworzonych rekordów do liczby newsów, bo cross join tworzy w bazie tymczasowo (newsy * userzy * kategorie) rekordów, czyli, przykładowo 50 newsów * 40 userów * 5 kategorii, to 10000 rekordów tymczasowych(!) i jedzie po bazie przez to równo. LEFT JOINy zaś do newsów wyszukają z bazy konkretną kategorię i usera przypisanego. Problemem może być przypisanie newsa do kilku kategorii, ale w takim wypadku baza (i zapytanie) nieco inaczej wygląda, ponieważ usuwa się z tabeli news id_kategorii i tworzy tabelę złączeniową, w której jako kolumny są id_newsa i id_kategorii. Błąd wyskakiwał ci ponieważ przy jakimkolwiek joinie kilka kolumn o tej samej nazwie zawsze robi bajzel przy próbie wyciągania danych z rekordu. Stąd najlepiej wybrać tylko niezbędne Ci dane, a dla dubli na wszelki wypadek ustawić aliasy. To fragment: k.nazwa AS kategoria co sprawi, że nazwa kategorii będzie widoczna jako kategoria. W Twoim wypadku problem był z kolumnami id, które były w każdej z tabel i jeśli byś chciał się do nich odnieść to musiałbyś po prostu znać ich dokładne nazwy po zastosowaniu join, ale lepiej w takich wypadkach właśnie na te duble zastosować aliasy. Ja użyłem wszystkich danych z tabeli news, a z pozostałych wyciągnąłem tylko te niezbędne mi do działania skryptu, czyli login usera i nazwę kategorii. Ty akurat możesz chcieć coś więcej z tych dwóch ostatnich. Ten post edytował thek 23.08.2009, 11:24:57 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 06:51 |