MySQL使用子查询中的WHERE匹配多个结果

时间:2011-06-05 23:21:37

标签: mysql dynamic joomla subquery where

我坚持这个:我正在做一个Joomla! 1.6扩展和使用类别。

对于那些没有使用类别的人,他们的工作方式如下:

您可以创建一个类别(名称,描述,父级),并将其存储在类别表中。

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

idparent_id,我无需解释。

级别:是类别的级别,为0 ROOT,因此root的子级别为1级,级别1的子级别为2级等等。

lftrgt是用于包装所有类别子类别的值(当您需要将1级以下儿童的I.E.类别提升到2级时非常有用)

我的表格有catid列,指向相应类别的ID。

我需要的是让所有孩子都从这个类别中获得,但只有一个级别,

即。如果我的catid指向2级类别,我需要获得级别为3且其父级id = catid的所有类别

如何编写查询?

我有类似的东西(查询是由PHP脚本编写的)/

让我们试试1级

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

如何与所有子查询的值进行比较?

2 个答案:

答案 0 :(得分:1)

没有子查询,您将获得更好的性能:

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。

答案 1 :(得分:0)

您可以使用IN

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