Spotkałem się z problemem stronicowania przy łączeniu kilku tabel.
Załóżmy że mam tabelę artykułów, ich kategorii i trzecią w której składuje identyfikatory artykułów i kategorii celem powiązania ich ze sobą.
W zapytaniu łączę tabele ( LEFT JOIN ) co w przypadku dwóch kategorii przypisanych do jednego artykułu zwróci mi dwa wyniki opisujące jeden artykuł.
Co mam zrobić w takim razie jeśli chcę pobrać tylko 5 artykułów? Jeśli wpiszę LIMIT 5 artykuł z dwiema kategoriami zwróci mi dwa wiersze wyników i tak na prawdę tylko 4 artykuły zostaną pobrane.
Czy można wprowadzić limit na kolumnę ? Na przykład: Pobierz dane z tabeli artykuły łącząc z tabelą łącznik gdzie art.id = łącznik.art_id i połącz z kategorie gdzie cat.id = łącznik.cat_id WHERE art.id 5 unikalnych - zamiast LIMIT 5
edit>
Moje wyjaśnienie pewnie guzik daje więc wrzucam bazę i zapytanie
Zapytanie:
/*Table structure for table `article_categories` */ CREATE TABLE `article_categories` ( `acs_id` int(11) NOT NULL AUTO_INCREMENT, `acs_name` varchar(256) DEFAULT NULL, `acs_color` varchar(9) DEFAULT NULL, PRIMARY KEY (`acs_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; /*Data for the table `article_categories` */ INSERT INTO `article_categories`(`acs_id`,`acs_name`,`acs_color`) VALUES (1,'Test 1','00ff00'),(2,'Test 2','00ff00'),(3,'Test 3','00ff00'); /*Table structure for table `article_category` */ CREATE TABLE `article_category` ( `_al_id` int(11) NOT NULL, `_acs_id` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*Data for the table `article_category` */ INSERT INTO `article_category`(`_al_id`,`_acs_id`) VALUES (1,1),(1,2),(2,1),(2,2),(2,1),(3,1),(3,3),(4,1),(4,4); /*Table structure for table `article_list` */ CREATE TABLE `article_list` ( `al_id` int(11) NOT NULL AUTO_INCREMENT, `al_title` varchar(256) NOT NULL, `al_desc` text NOT NULL, `al_content` text NOT NULL, `al_date_added` datetime NOT NULL, `al_date_update` datetime NOT NULL, `_u_id` int(11) NOT NULL, PRIMARY KEY (`al_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; /*Data for the table `article_list` */ INSERT INTO `article_list`(`al_id`,`al_title`,`al_desc`,`al_content`,`al_date_added`,`al_date_update`,`_u_id`) VALUES (1,'Tytul 1','Opis 1','Treść 1','0000-00-00 00:00:00','0000-00-00 00:00:00',1),(2,'Tytul 2','Opis 2','Treść 2','0000-00-00 00:00:00','0000-00-00 00:00:00',1),(3,'Tytuł 3','Opis 3','Treść 3','0000-00-00 00:00:00','0000-00-00 00:00:00',1),(4,'Tytuł 4','Opis 4','Treść 4','0000-00-00 00:00:00','0000-00-00 00:00:00',1),(5,'Tytuł 5','Opis 5','Treść 5','0000-00-00 00:00:00','0000-00-00 00:00:00',1),(6,'Tytuł 6','Opis 6','Treść 6','0000-00-00 00:00:00','0000-00-00 00:00:00',1);
SELECT `al`.`al_id`, `al`.`al_title`, `al`.`al_desc`, `al`.`al_date_added`, `al`.`al_date_update`, `al`.`_u_id`, `ac`.*, `acs`.* FROM `article_list` AS `al` LEFT JOIN `article_category` AS `ac` ON `al`.`al_id` = `ac`.`_al_id` LEFT JOIN `article_categories` AS `acs` ON `acs`.`acs_id` = `ac`.`_acs_id` LIMIT 5
Dostanę wynik:
Cytat
+-------+----------+---------+-
| al_id | al_title | al_desc |
+-------+----------+---------+-
| 1 | Tytul 1 | Opis 1 |
| 1 | Tytul 1 | Opis 1 |
| 2 | Tytul 2 | Opis 2 |
| 2 | Tytul 2 | Opis 2 |
| 3 | Tytul 3 | Opis 3 |
+-------+----------+---------+-
Czyli zamiast 5 wyników dostaję 3 wyniki. Winowajcą jest LIMIT który zlicza mi wiersze zamiast unikalnych wystąpień na przykład al_id. Jak zmusić zapytanie do pobierania wyników o 5 unikalnych identyfikatorach a nie 5 wierszach.
| al_id | al_title | al_desc |
+-------+----------+---------+-
| 1 | Tytul 1 | Opis 1 |
| 1 | Tytul 1 | Opis 1 |
| 2 | Tytul 2 | Opis 2 |
| 2 | Tytul 2 | Opis 2 |
| 3 | Tytul 3 | Opis 3 |
+-------+----------+---------+-