Luerssen
Новичок
Выборка по иерархии, пока не найден `primary` = 1
И так, есть:
И задача:
Выбрать все строки из items где primary = 1, идя по такой иерархии: сначла проверяем object_type = phone, потом brand, потом global. При этом items.categories_id = 23.
Могу сделать 3мя запросами, но думаю что будет долго работать, можно ли спасти меня и показать как сделать 1им запросом.
Пример:
После выборки по categories_id = 5, я должен получить 2ую запись из smart_join
А по categories_id = 24, я должен получить 5ую запись из smart_join
И так, есть:
Код:
mysql> desc items;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| categories_id | int(11) | NO | | | |
| rewrite | varchar(256) | NO | UNI | | |
| name | varchar(256) | NO | MUL | | |
| description | text | NO | | | |
| price | double(7,2) | NO | | | |
| available | tinyint(1) | NO | | 1 | |
| image | varchar(256) | NO | | | |
| primary | tinyint(1) | NO | | 0 | |
+---------------+--------------+------+-----+---------+----------------+
mysql> desc smart_join;
+-------------+-------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------------------------------+------+-----+---------+-------+
| object_type | enum('global','category','brand','phone') | NO | MUL | | |
| object_id | int(11) | NO | | | |
| items_id | int(11) | NO | | | |
+-------------+-------------------------------------------+------+-----+---------+-------+
Выбрать все строки из items где primary = 1, идя по такой иерархии: сначла проверяем object_type = phone, потом brand, потом global. При этом items.categories_id = 23.
Могу сделать 3мя запросами, но думаю что будет долго работать, можно ли спасти меня и показать как сделать 1им запросом.
Пример:
Код:
items:
mysql> SELECT * FROM items;
+----+---------------+--------------------------+------------------------------+-----------------------+--------+-----------+--------+---------+
| id | categories_id | rewrite | name | description | price | available | image | primary |
+----+---------------+--------------------------+------------------------------+-----------------------+--------+-----------+--------+---------+
| 1 | 5 | accumurheiser_x1200 | АккумулZeinheiser X1200 | !list!!/list! | 150.00 | 1 | 06.jpg | 1 |
| 2 | 5 | accumurheiser_x1210 | АккумулZeinheiser X1210 | !list!!/list! | 130.00 | 1 | 06.jpg | 0 |
| 3 | 5 | accumurheiser_x1230 | АккумулZeinheiser X1230 | !list!!/list! | 149.52 | 1 | 06.jpg | 0 |
| 4 | 23 | xen | xen21 | xennn | 120.00 | 1 | 04.jpg | 0 |
| 5 | 23 | xen12 | xen12 | xennn | 119.00 | 1 | 04.jpg | 1 |
+----+---------------+--------------------------+------------------------------+-----------------------+--------+-----------+--------+---------+
5 rows in set (0.00 sec)
mysql> SELECT * FROM smart_join
- +-------------+-----------+----------+
# | object_type | object_id | items_id |
- +-------------+-----------+----------+
1 | brand | 4 | 1 |
2 | phone | 3424 | 1 |
3 | brand | 4 | 3 |
4 | brand | 24 | 4 |
5 | brand | 24 | 5 |
- +-------------+-----------+----------+
5 rows in set (0.00 sec)
А по categories_id = 24, я должен получить 5ую запись из smart_join