![]() |
![]() ![]() |
![]() |
--Obcy-- |
![]()
Post
#1
|
Goście ![]() |
Witam.
Ostatnio napisałem prosty system newsów, wszystko jest ok ale... Mam pięć 'kategorii' newsów rozmieszczonych w tabelach odpowiadających kategorii. Na podstronie danej kategorii wyświetlam 10 ostatnich... Ale chciałbym na stronie głównej umieścić 5 ostatnich ogólnie, czyli ze wszystkich kategorii. Myślałem, żeby zrobić po prostu: ostatni z 1 kat. ostatni z 2 kat. ostatni z 3 kat. ostatni z 4 kat. ostatni z 5 kat. Ale to odpada bo jest to dosyć 'sztywne' i w ogóle nie o to chodzi. Dodając 5 newsów do kat. 3 (do reszty nic) na głównej powinno wyświetlić się te 5 nowo dodanych. PS. Pisząc posta wpadłem na pomysł (IMG:style_emoticons/default/smile.gif) (Forum pomaga samo z siebie bez interwencji użytkowników (IMG:style_emoticons/default/biggrin.gif) ) Można przecież wszystkie newsy upakować w jednej tabeli i stworzyć kolumnę 'kategoria'. Później przy pobieraniu tych 5-ciu darować sobie WHERE i jest 5 ostatnich (IMG:style_emoticons/default/smile.gif) A przy pobieraniu rekordów dla danej kategorii zastosować:
Czy dobrze kombinuję? ;> A może jakiś lepszy i wydajniejszy sposób znacie? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Bardzo dobrze, ale to dopiero początek kombinowania (IMG:style_emoticons/default/wink.gif) Tak było 20 lat temu, tzn. jeden news można dopasować do jednej kategorii. Teraz kategorie nazywa się tagami i do jednego newsa/postu/artykułu przypisuje się dowolną ilość kategorii/tagów. Potrzebujesz 3 tabele:
Ta trzecia tabela służy do łączenia (za pomocą identyfikatorów) newsów z kategoriami/tagami. Żeby wyciągnąć z tabeli 5 ostatnich newsów sortujesz po dacie malejąco; ORDER BY `data_dodania` DESC LIMIT 5. |
|
|
--Obcy-- |
![]()
Post
#3
|
Goście ![]() |
Czy dobrze rozumiem logikę?
Dodaję newsa wybierając kategorię1 W tabeli 'newsy' wszystko ląduje na swoje miejsce (pomijając datę modyfikacji - ty jest pusto) Jednocześnie do tabeli 'news_kategoria' ląduje takie samo id_newsa jak w tabeli 'newsy' oraz id_kategoria takie samo jak w tabeli 'kategorie' Ale jak odwołać się do tych 3 tabel? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Czy dobrze rozumiem logikę? Dodaję newsa wybierając kategorię1 W tabeli 'newsy' wszystko ląduje na swoje miejsce (pomijając datę modyfikacji - ty jest pusto) Jednocześnie do tabeli 'news_kategoria' ląduje takie samo id_newsa jak w tabeli 'newsy' oraz id_kategoria takie samo jak w tabeli 'kategorie' Tak. Dokładnie tak. Dodając newsa możesz wybrać nawet więcej niż jedną kategorię, ale to nie jest wymóg. Brak kategorii też powinien być dopuszczalny. Powinna być po prostu możliwość edytowania kategorii (np dla admina albo moderatorów albo autora newsa). Ale jak odwołać się do tych 3 tabel? Trzeba je łączyć składnią językową JOIN. Na przykład, żeby pobrać 2 ostatnie newsy posortowanye po dacie malejąco, razem ze wszystkimi kategoriami, do których każdy jest przypisany:
W wyniku można dostać coś takiego: Kod id_newsa | tytul | kategorie ---------+--------------------------------+-------------------------- 123 | Mój sto dwudziesty trzeci news | komputery,nauka 2 | Teścik | testy,programowanie,mysql A taki wynik można elegancko obrobić w PHP. JOINy są dla niektórych na początku trudne do ogarnięcia, zwłaszcza że jeden cel można czasami osiągnąć kilkoma sposobami, ale trening czyni mistrza ;) |
|
|
--Obcy-- |
![]()
Post
#5
|
Goście ![]() |
Czyli: Wybieram id_newsa i tytul z tabeli 'newsy' dla których przypisana jest kolumna 'nazwa' z tabeli 'kategorie'. Dla tabeli 'newsy' przypisuję alians(?) 'n', dla 'kategoria' alians 'k', a alians 'nk' to tabela 'news_kategoria'. Tutaj przypisuję 'nk' dla 'news_kategoria', w której kolumna 'id_newsa' z tabeli 'nk' przyjmuje tą samą wartość co 'id_newsa' z tabeli 'news'. Tutaj podobnie jak wcześniej. 'id_kategoria' z tabeli 'kategorie' = 'id_newsa' z tabeli 'news_kategoria'. Mogę się mylić bo to tylko moja analiza kodu. Mam nadzieję, że dobrze to rozumiem (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Jeśli to był Twój pierwszy kontakt z JOINami i tyle z tego wydedukowałeś to gratulacje. To będzie dla Ciebie małe piwo (IMG:style_emoticons/default/smile.gif)
Te alternatywne nazwy to aliasy. |
|
|
--Obcy-- |
![]()
Post
#7
|
Goście ![]() |
Nie rozumiem tylko jednej rzeczy (IMG:style_emoticons/default/smile.gif)
Przy dodawaniu newsa mam:
Newsa dodaje ale nie wiem jak wykorzystać w tym zapytaniu tabele kategoria. Chodzi mi dokładnie o tę parę: Jak wybrać nazwę kategorii, sprawdzić jej id i włączyć je do powyższego? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Składni INSERT używa się w inny sposób:
INSERT INTO nazwa_tabeli [(nazwa_kolumny [, nazwa_kolumny, ...])] VALUES (dane, dane, ...) Nazwy kolumn w nawiasie, po nazwie tabeli, są opcjonalne, ale warto je precyzować, dla czytelności i na wszelki wypadek, gdyby się w przyszłości kolejność i ilość kolumn w tabeli zmieniła. Do każdej tabeli INSERTuje się osobno:
To jeden ze sposobów. W PHP też można bez dodatkowych zapytań sprawdzić wartość ostatnio wygenerowanego auto incrementem identyfikatora. Albo zrobić to dodatkowe zapytanie żeby to sprawdzić. Najlepiej różne opcje ćwiczyć i zobaczyć, z którą się mi najwygodniej pracuje. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 13:14 |