ďťż

[SQL] Pobrać co najmniej 10 rekordów dla każdego `język`

       

Podstrony


telcocafe

Pola w tabeli artykuły:

ID | Tytuł | Język | Włączony

Czy da się skonstruować zapytanie (dla MySQL 5 oraz SQLite 3), aby pobrać co najmniej 10 najnowszych rekordów (ORDER BY ID DESC) dla każdej innej wartości pola Język? Rekordy muszą spełniać dodatkowo warunek: WHERE `Włączony` = 1

Załóżmy, że istnieją 2 języki: PL i EN. Chcę wyciągnąć listę artykułów, która będzie zawierać 10 po angielsku oraz 10 po polsku. Nie mogę po prostu napisać: LIMIT 20, gdyż równowaga ilości artykułów w poszczególnych językach zostanie zachwiana (np. 5 po angielsku i 15 po polsku).

Jest to w ogóle możliwe Jeśli nie, będę musiał wysyłać więcej zapytań. N = liczba typów * liczba języków.

PS. Polskie znaki są w przykładzie dla ułatwienia. W rzeczywistości stosuję angielskie słowa.



$data1 = mysql_query('select jezyk from artykuly where wlaczony = 1'); $jezyki = array(); while($a = mysql_fetch_assoc) $jezyki[] = $a['jezyk']; array_unique($jezyki);

w ten sposób mozna pobrać jakie są jezyki (np $jezyki = array('PL','EN'))

nie lepiej zrobić osobną tabelę 'Langs'?


|id||langCaption|
|1||Polish|
|2||English|
potem do artów w Język dawać np 1 a potem przy wypisywaniu danych dać warunek:


while($data = ...) {
if($data == $_SESSION['lang']) {
[....]
}
}


? :)

czy język będzie identyfikowany po liczbie czy po łańcuchu to wielkiej różnicy nie zrobi. Kwestia tylko czy potrzebny jest taki system wielojęzyczności treści. Zazwyczaj serwisy wielojęzyczne z regularnie pojawiającą się dynamiczną treścią oferują oddzielne instancje serwisu dla każdego z języków (wikipedia dla przykładu). Tego typu rozwiązanie co powyżej można zastosować raczej dla bardzo prostych stron - np. strona firmy o stałej zawartości (kontakt/oferta itp.)

Napisałem funkcję: http://www.unit1.pl/pb-897
Przykładowe zapytanie: http://www.unit1.pl/pb-898

Niestety nie osiągnąłem pożądanego rezultatu. Powyższe zapytanie pobiera tylko 5 rekordów. Gdy zamienię 5 na 15, otrzymuję 15 pozycji dowolnego typu (czyli nie 5 x 3). Gdy umieszczę słowo LIMIT w każdej z 3 części zapytania, SQLite wyrzuca błąd, że LIMIT nie może stać przed UNION.

Jeszcze większy problem z sortowaniem. Chcę pobrać 5 najnowszych pozycji dla każdego typu. Zapytanie wyciąga 5 najstarszych. Gdy umieszczę ORDER BY w każdej części, występuje błąd, że ORDER BY nie może stać przed UNION. Gdy umieszczę go tylko w ostatniej części (przed LIMIT), otrzymuję kolejny błąd:General error: 1 ORDER BY term number 1 does not match any result columnORDER BY i.ID DESCJeśli z UNION usunę ALL, SQLite sortuje rekordy automatycznie (bez ORDER BY).

A może lepiej nie dzielić listy najnowszych pozycji na typy (artykuły, pliki, zdjęcia), lecz na kategorie, do których należą?



Wykonaj oddzielne zapytania dla każdego języka i spokój.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.