MySQL сопоставить несколько результатов, используя WHERE из подзапроса - PullRequest
0 голосов
/ 06 июня 2011

Я застрял на этом: я работаю над Joomla!1.6 расширение и использование категорий.

Для тех, кто не использовал категории, они работают следующим образом:

Вы создаете категорию (имя, описание, родительский элемент), и она сохраняется в таблице категорий..

|  id  |  parent_id  |  lft  |  rgt  |  level  |  etc  |
--------------------------------------------------------
|   1  |      0      |   -   |   -   |    1    |
|   2  |      1      |   -   |   -   |    2    |

id и parent_id, мне не нужно объяснять.

level: уровень категории, равный 0 ROOT, поэтому он является потомком rootбудет уровень 1, а потомок уровня один - уровень 2 и т. д.

lft и rgt - это значения, используемые для переноса всех подкатегорий категорий (полезно, когда необходимо получить категорию IE уровня 1дети до уровня 2)

В моей таблице есть столбец catid, который указывает на идентификатор соответствующей категории.

Мне нужно получить всех детей из этой категории, но толькона один уровень ниже,

IE, если мои catid указывают на категорию уровня 2, мне нужно получить все категории, уровень которых равен 3, и идентификатор их родителя = catid

.запрос?

У меня есть что-то вроде этого (запрос пишетсяn с помощью сценария PHP) /

Давайте попробуем с категорией уровня 1

SELECT * 
FROM my_table 
WHERE catid = 1 
   OR catid = (SELECT catid 
               FROM categories 
               WHERE level = 2 AND parent_id = 1)

Как я могу сравнить со всеми значениями подзапроса?

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Вы получите лучшую производительность без подзапроса:

SELECT t.*
FROM my_table AS t
INNER JOIN categories AS c ON t.catid = c.id
WHERE c.id = 1
OR c.parent_id = 1

Я специально пропустил level = 2, так как это избыточная информация.Если категория имеет parent_id = 1, то ее уровень = 2.

0 голосов
/ 06 июня 2011

Вы можете использовать IN.

SELECT *
FROM   my_table
WHERE  catid = 1
        OR catid IN (SELECT catid
                     FROM   categories
                     WHERE  level = 2
                            AND parent_id = 1) 
...