Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][SQL]Optymalne wyciąganie rekordów z danej kategorii
matix
post
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


Siema,
pytanie do mądrzejszych ode mnie i bardziej doświadczonych. W jaki sposób wyciągacie n rekordów z x kategorii. Przykład?

Cytat
Pobierz 5 kategorii oraz po 5 filmów do każdej z nich.

Zakładając, że schemat bazy jest bardzo prosty

Kod
category:
cat_id
cat_name

video:
video_title
video_cat_id (references cat_id)


Obecnie po głębszych przemyśleniach moje rozwiązania:

1. wyciągamy np. 5 kategorii zapytaniem:
  1. SELECT cat_name FROM cms_categories LIMIT 0, 5


Następnie tworzymy drugie zapytanie, które wyciąga po 4 filmy do danej kategorii, wyglądające mniej więcej tak:
  1. (SELECT video_id,video_title,video_length,video_image,video_views,video_rating,video_cat_id,video_service_id FROM cms_views_video WHERE video_cat_id = 10 AND video_state = 1 LIMIT 0, 4)
  2. UNION
  3. (SELECT video_id,video_title,video_length,video_image,video_views,video_rating,video_cat_id,video_service_id FROM cms_views_video WHERE video_cat_id = 9 AND video_state = 1 LIMIT 0, 4)
  4. UNION
  5. (SELECT video_id,video_title,video_length,video_image,video_views,video_rating,video_cat_id,video_service_id FROM cms_views_video WHERE video_cat_id = 8 AND video_state = 1 LIMIT 0, 4)


2. Jedno duże zapytanie JOIN. To akurat mój nowy pomysł, jednak nie wiem jakby takie zapytanie miało wyglądać. Generalnie wyglądałoby to mniej więcej tak, że te 2 zapytania byłyby ze sobą połączone, prawdopodobnie to drugie byłoby warunkiem WHERE cat_id IN (), jednak to jest znacznie bardziej skomplikowane.

Więc teraz pytanie do Was, w jaki sposób rozwiązujecie takie rzeczy?
Go to the top of the page
+Quote Post
potreb
post
Post #2





Grupa: Zarejestrowani
Postów: 1 568
Pomógł: 192
Dołączył: 7.03.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ja bym zrobił inaczej, pobieram kategorie, robie LEFT JOIN video i pobieram rekordy wideo gdzie video_cat_id ON cat_id, jedno krotkie zapytanie.
Go to the top of the page
+Quote Post
matix
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


No ok, a w jaki sposób wyciągniesz określoną ilość filmów dla danej kategorii?
Go to the top of the page
+Quote Post
sniver
post
Post #4





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

Ostrzeżenie: (0%)
-----


  1. SELECT cat_name FROM cms_categories LIMIT 0, 5


to bym zrobił nieco inaczej, tylko dlatego by optymalnie działało. Bo po co np. pokazywać puste kategorie jak i tak tam nic nie ma (IMG:style_emoticons/default/smile.gif)

  1. SELECT
  2. `c`.`cat_name` AS `name`,
  3. (
  4. SELECT COUNT(1) FROM `cms_views_video` AS `v`
  5. WHERE
  6. (`v`.`video_cat_id` = `c`.`video_cat_id`)
  7. ) AS `licz`
  8.  
  9. FROM
  10. `cms_categories` AS `c`
  11.  
  12. HAVING
  13. (`LICZ` > 0)


Dalszą część zostawił bym jak jest...

Jest jeden szkopuł, jeśli stworzył byś mechanizm z zagnieżdżaniem kategorii w stylu Rodzic - dzieci - dziecko dziecka - dziecko ... - dziecko n (nie wiem czy dobrze do opisałem) musiał byś oprzeć to na jakimś liczniku..

tyle ode mnie w tej sprawie (IMG:style_emoticons/default/smile.gif)

Ten post edytował sniver 22.04.2010, 07:53:52
Go to the top of the page
+Quote Post
matix
post
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


@Sniver, podałeś dokładnie to samo co ja, tylko jeszcze mniej optymalne (samo "having" jest dość ciężkie).

Bardziej zależy mi na optymalnym rozwiązaniu mojego problemu poprzez jedno zapytanie.
Go to the top of the page
+Quote Post
WoGuziczek
post
Post #6





Grupa: Zarejestrowani
Postów: 52
Pomógł: 0
Dołączył: 17.09.2008

Ostrzeżenie: (0%)
-----


Gdybym ja zaczął robić coś takiego utworzyłbym nową kolumnę count w tabeli category.
Po wykonaniu tego trzeba w miejscu gdzie dodajesz/usuwasz filmy dodać odpowiedni skrypt, który doda lub odejmie od licznika w zależności od tego co zrobisz.
Po zrobieniu tego jednorazowo trzeba odpalić mały skrypcik, który wykona
  1. SELECT COUNT(*) WHERE video_cat_id = 'tutaj id kazdej kategorii pobranej zapytaniem przez SELECT cat_id FROM category'
dla każdej kategorii i zapisze w kolumnie count ilość filmów się w niej znajdujących.

Teraz już masełko, bo robisz tak jak polecił potreb.
Jedno małe zapytanie z jednym LEFT JOIN

Ten post edytował WoGuziczek 24.04.2010, 15:56:11
Go to the top of the page
+Quote Post
aio
post
Post #7





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


Kod
SELECT  *
FROM    (
        SELECT  c.*
        FROM    category c, (SELECT @L:=0, @C:=0) init
        -- WHERE cat.id IN (1,2,3)  -- ewentualnie ręczny wybór kategorii
        LIMIT /* liczba kategorii: */ 5
        ) c
LEFT JOIN video v
ON      IF(video_cat_id = cat_id
        AND IF(@L=cat_id,@C:=@C+1,(@L:=cat_id) AND @C:=0) <= /* liczba video: */ 5
        ,1,0)
Go to the top of the page
+Quote Post
matix
post
Post #8





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


@aio: To co napisałeś wydaje się być działającym rozwiązaniem, ale czy na pewno szybszym od tego co ja zaproponowałem? Jak z wydajnością takich zapytań?
Go to the top of the page
+Quote Post
aio
post
Post #9





Grupa: Zarejestrowani
Postów: 28
Pomógł: 4
Dołączył: 13.11.2009

Ostrzeżenie: (0%)
-----


Cytat(matix @ 25.04.2010, 23:13:51 ) *
@aio: To co napisałeś wydaje się być działającym rozwiązaniem, ale czy na pewno szybszym od tego co ja zaproponowałem? Jak z wydajnością takich zapytań?

ich weiss nicht - ale mógłbyś sprawdzić, i pewnie nikt by nie miał za złe gdybyś ogłosił wyniki (IMG:style_emoticons/default/winksmiley.jpg)
dałem warunek do ON żeby filtrowało na jak najniższym poziomie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.09.2025 - 17:33