【问题标题】:MySQL: Combining multiple where conditionsMySQL:结合多个where条件
【发布时间】:2010-06-06 20:13:17
【问题描述】:

我正在开发一个菜单系统,该系统需要一个 url,然后查询数据库来构建菜单。
我的菜单表是:

+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment | 
| node_id | int(11)      | YES  |     | NULL    |                | 
| parent  | int(11)      | YES  |     | NULL    |                | 
| weight  | int(11)      | YES  |     | NULL    |                | 
| title   | varchar(250) | YES  |     | NULL    |                | 
| alias   | varchar(250) | YES  |     | NULL    |                | 
| exclude | int(11)      | YES  |     | NULL    |                | 
+---------+--------------+------+-----+---------+----------------+

我的问题的相关列是别名、父级和 node_id。
所以对于像这样的网址:http://example.com/folder1/folder2/filename
别名可能 = “文件名”、“文件夹 1”、“文件夹 2”
Parent = 父文件夹的 node_id。

我所知道的是如何将 url 拆分为一个数组并检查别名是否与每个部分匹配。 我不知道如何让它按别名匹配“folder2”且父别名匹配“folder1”的父级过滤。 我想像这样的查询:

select * from menu 
where alias='filename' and 
where parent = node_id 
where alias='folder2' and parent = node_id 
where alias='folder1'

除非我知道以上是错误的。我希望这可以在一个查询中完成。

提前感谢您的帮助!

【问题讨论】:

  • 示例数据和基于数据的预期输出会有所帮助。

标签: mysql


【解决方案1】:
select * from menu 
where alias='filename' and 
parent = (select node_id from menu
          where alias='folder2' and
          parent = (select node_id from menu
                    where alias='folder1'
                   )
         )

【讨论】:

  • 这是关键。我只需要稍微改变它,对子查询使用“parent in”而不是“parent =”,因为它们返回了多行。非常感谢你们!
【解决方案2】:

我无法获得您想要的查询,但这里有 2 条规则供您参考:

  • WHERE 语句应该只有一个。
  • 生成的表达式将逐一应用于每一行。不是您可能认为的“整个”表。所以,在创作表达的时候,你必须认真思考。不会同时匹配 alias='folder2' alias='folder1'

【讨论】:

    【解决方案3】:

    这应该为你做。它通过父节点(如果有的话)链接所有节点,并将检索一条记录中所有级别的信息。

    select * 
    from menu m1
    left outer join menu m2 on m1.parent = m2.node_id
    left outer join menu m3 on m2.parent = m3.node_id
    where m1.alias = 'filename' 
        and m2.alias = 'folder2'
        and m3.alias = 'folder1'
    

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2017-11-02
      • 2012-06-02
      • 2012-08-03
      相关资源
      最近更新 更多