Wyciąganie tablice ID przedmiotów należących do kategorii i rubkategorii.

0

Witam.
Użeram się już kilka godzin ale jednak PL/SQL nie jest moją mocną stroną. Potrzebuje stworzyć zapytanie do bazy MySQL, które wyciągnie mi ID wszystkich rekordów z tabeli ITEMS, które posiadają CATEGORY_ID równą podanej wartości. Ponadto te wartości są dynamicznie ładowane przez stworzone drzewo kategorii z tabeli CATEGORY od danego ID do wszystkich subkategorii zawierających PARENT_ID.
Nie bardzo umiem to wytłumaczyć więc logikę tego zamknąłem w PHP

	private function getCategorys($id) {
		$q = $this->db->query ( "SELECT id FROM tbl_category WHERE parent_id = '$id';" );
		while ( $r = $this->db->fetch ( $q ) ) {
			$this->getItems ( $r ['id'] );
			$this->getCategorys ( $r ['id'] );
		}
	}
	private function getItems($id) {
		global $array_item;
		$q = $this->db->query ( "SELECT id FROM tbl_item WHERE category_id = '$id';" );
		while ( $r = $this->db->fetch ( $q ) ) {
			$array_item [] = $id;
		}
	}
	public function getCategoryItem($id) {
		global $array_item;
		$array_item = array ();
		$this->getCategorys ( $id );
		$this->getItems( $id );
		return $array_item;
	}
CREATE TABLE IF NOT EXISTS `tbl_category` (
  `id` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `tbl_cateogry` (`id`, `parent_id`, `name`) VALUES
(1, 0, 'Baza'),
(2, 0, 'Category1'),
(3, 2, 'Sub1'),
(4, 2, 'Sub2'),
(5, 0, 'Category2'),
(6, 5, 'Sub3');

CREATE TABLE IF NOT EXISTS `tbl_item` (
  `id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


INSERT INTO `tbl_item` (`id`, `category_id`, `name`,) VALUES
(1,2, 'Item'),
(2,3, 'Item'),
(3,3, 'Item'),
(4,4, 'Item'),
(5,6, 'Item');

i wywołując metodą getCategoryItem(2); dostanę tablicę id = array(1,2,3,4)
Ale naprawdę nie umiem tego ugryźć w jednym zapytaniu a tak nadziabane w PHP jest karygodne nie mówiąc o czasie wykonywania przy większej ilości rekordów.
Prosiłbym o pomoc.

0

Funkcja LIST() może Ci pomóc - dostaniesz ładnie w "rządku" jako string id podkategorii.

Dla konkretnej kategorii:

select list(id) as sub_items 
from tbl_item 
where category_id='$id'

Dla kilku kategorii w jednym zapytania (jak by było potrzebne):

select category_id,list(id) as sub_items 
from tbl_item 
group by category_id
0

Witam, po kilkudziesięciu godzin poszukiwań natknąłem się na rozwiązanie.
Problem został rozwiązany to http://dba.stackexchange.com/questions/30021/mysql-tree-hierarchical-query
Po małym przerobieniu funkcji osiągnąłem oczekiwany rezultat i w jednym zapytaniu zwraca mi wszystko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1