Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie pobierajace jeden wpis z kazdej z podanych kategorii
Forum PHP.pl > Forum > Bazy danych > MySQL
jacek_f
Witam, chodzi mi o zapytanie, ktore pobierze np. jeden zwrocony losowo wiersz z kazdej z wystepujacyh w bazie kategorii. Mam powiedzmy baze samochodow i rozne kategorie np. dostawcze, osobowe itp. I chce pobrac z tabeli jeden wpis z kazdej kategorii. Czyli jeden przykladowy samochod osobowy, jeden dostawczy itd. Wiem, ze mozna to zrobi za pomoca UNION ALL, czyli pobrac po kolei jeden wiersz z jednej kategorii, potem zdrugiej i laczyc UNION. A inaczej? Ma ktos moze pomysl?

Pozdrawiam
Indeo
Dla takiej struktury tabel:

  1. #categories
  2.  
  3. kat_id | cat_name
  4. ---------------------------
  5. 1 | kwiaty
  6. 2 | drzewa
  7.  
  8.  
  9.  
  10.  
  11. #items
  12.  
  13. id | cat_id | name
  14. --------------------------------------
  15. 234 | 1 | róża
  16. 235 | 1 | tulipan
  17. 236 | 2 | sosna
  18. 237 | 2 | dąb


Takie zapytanie:
  1. SELECT C.cat_id,C.cat_name,(SELECT name FROM items WHERE cat_id=C.cat_id ORDER BY rand() LIMIT 1 ) AS name
  2. FROM categories C;
ebooki24
Mam podobny problem ale nie moge sobie z nim poradzic:
Kategorie
  1. CREATE TABLE `max_category_menu` (
  2. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  3. `anchor` varchar(255) collate utf8_unicode_ci NOT NULL,
  4. `url` varchar(255) collate utf8_unicode_ci NOT NULL,
  5. `description` varchar(255) collate utf8_unicode_ci NOT NULL,
  6. `permission` enum('1','0') collate utf8_unicode_ci NOT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=25 ;
  9.  
  10. INSERT INTO `max_category_menu` (`id`, `anchor`, `url`, `description`, `permission`) VALUES (1, 'A', 'a', 'Sentencje na litere A', '1'),
  11. ...


Sentencje:
  1. CREATE TABLE `max_latin_maxim` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `latin` varchar(255) collate utf8_unicode_ci NOT NULL,
  4. `polish` varchar(255) collate utf8_unicode_ci NOT NULL,
  5. `uid` int(11) NOT NULL,
  6. `rank` decimal(10,0) NOT NULL,
  7. `counter` bigint(20) NOT NULL,
  8. `permission` SET('1','0') collate utf8_unicode_ci NOT NULL,
  9. PRIMARY KEY (`id`),
  10. FULLTEXT KEY `latin` (`latin`),
  11. FULLTEXT KEY `polish` (`polish`)
  12. ) ENGINE=MyISAM AUTO_INCREMENT=953 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=953 ;
  13.  
  14. INSERT INTO `max_latin_maxim` (`id`, `latin`, `polish`, `uid`, `rank`, `counter`, `permission`) VALUES (1, 'A capite ad calcem', 'Od głowy do pięty (Od stóp do głów).', 0, 0, 0, '1');
  15. ...


Chce pobrac na glownej stronie jedna losowa sentencje z kazdej kategorii (na kazda litere alfabetu)
Sklecilem taka komende:

  1. SELECT C.url,(SELECT latin FROM max_latin_maxim WHERE latin LIKE 'C.url%' ORDER BY rand() LIMIT 1 ) AS latin FROM max_category_menu C


ale w polu latin jest wartosc NULL sad.gif

Co zrobic?
Indeo
Co wiąże te tabele, czyli w jaki sposób na poziomie danej sentencji jest zdefiniowana przynależność do kategorii (menu), bo nie mogę zrozumieć tej klauzuli where z użyciem pola URL ...
ebooki24
Te url to litery alfabetu a,b,c tak jakby ketegoria przez ktora wybieram sentencje np. sentencja "Que ..." bedzie pobrana przez like 'q%'.
  1. INSERT INTO `max_category_menu` (`id`, `anchor`, `url`, `description`, `permission`) VALUES (1, 'A', 'a', 'Sentencje na litere A', '1'),


Mysle ze zrozumiales to tak jakby bylo tylko a,b,c inne wartosci tu akurat sa nam niepotrzebne.
Indeo
Nadal nie napisałeś technicznie jaki jest związek między tabelami.
Czyli np logicznie tabela_A.pole_8 = tabela_B.pole_3. Wtedy byłoby jasne. A tak można sie tylko domyślać, że chodzi o sentencje zaczynające się na literę wymienianą w tabeli menu w polu url.
  1. SELECT C.url,(SELECT latin FROM max_latin_maxim WHERE upper(LEFT(latin,1)) = C.url ORDER BY rand() LIMIT 1 ) AS latin FROM max_category_menu C



Poza tym miałes 'C.url%' - mysql traktuje ten zapis dosłownie. Oczywiste jest że w bazie nie ma zapisu C.url%. Sprawdzaj najpierw podzapytania - jeśli będą w nich błędy będzie Ci trudno odnaleźć je w większym, złożonym zapytaniu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.