【问题标题】:MySQL select parents and child all from on tableMySQL从表中选择父母和孩子
【发布时间】:2014-06-14 03:49:53
【问题描述】:

我有一个包含父页面和子页面的表,其中首页是 parent_id = 0,子页面 parent_id 是其他页面的 id。

ID 1 | parent_id 0
ID 2 | parent_id 0
ID 3 | Parent_id 1
ID 4 | parent_id 1
ID 5 | parent_id 0

所以我有

SELECT *
FROM pages AS parent
WHERE parent.parent_id = 0

SELECT *
FROM pages AS sub
WHERE sub.parent_id != 0

上述单独查询的工作。但我敢肯定,可以通过一个查询列出所有页面。

我正在尝试获取与此类似的列表,将子页面分组到父页面

Main (Title1)
Main (Title2)
     SUB (Title1)
     SUB (Tible2)
Main (Title3)
etc

我一直在尝试内连接和左连接,但我无法解决这个问题。

我希望有经验的好心人能帮我一把。 :)

谢谢

【问题讨论】:

  • 我建议查看 SQL 的 groupby 函数。如果您列出您尝试过的一些东西(实际代码),那么有人可以为您调整。
  • select * from yourtable 将列出所有内容。如果您希望它采用树形结构,这取决于您。 SQL 不做“树”。它会处理数据集。
  • 当您在所需输出中的“SUB”之前有缩进时......这代表什么?这是否意味着您希望 mySQL 结果以某种方式格式化?因为那不可能发生。这是否只是意味着您希望按照所需输出的排序方式对结果进行排序?因为这是可行的,但它需要在 SQL 中进行一些疯狂的恶作剧才能成功。你最好把所有东西都拿出来用 PHP 做。
  • 你好。是的,我会做些什么来以“树”的方式获得列表。在 php 中,我通过两个查询和循环来提取我需要的内容。我正在寻找一种方法来对一个查询和一个优化查询的循环执行相同的操作。无论如何,这就是我的目标:)

标签: php mysql sql codeigniter


【解决方案1】:

尝试以下查询,它有额外的列 page_type 指示页面类型。

SELECT page.* , IF( (SELECT p.parent_id FROM pages p WHERE p.id = page.id) = 0, "PARENT", "CHILD" ) AS PAGE_TYPE FROM pages AS page

【讨论】:

  • 嗨。感谢您分享您的知识。这符合我的要求。有没有办法,因为子记录确实在父记录之后?像父亲>儿子一样做空他们|父亲| 高分辨率照片| CLIPARTO等
  • Order by on parent_id 可用于对记录进行排序,以便子记录在父记录之后...例如From pages as page order by page.parent_id asc
  • 嗨。我的意思是,我可以得到父母,然后是孩子,然后是另一个父母,如果存在孩子,然后是父母等等......直到列表完成?
  • 在这种情况下,如果多个父母处于同一级别并且每个人都有多个孩子,那么是否应该首先列出所有父母,然后应该列出所有孩子或第一父母及其所有孩子,然后第二个父母及其所有孩子??
  • 嗨。我希望它是父亲名单,然后是那个父亲的孩子。然后是那个父亲的下一个父亲和孩子。等等...使用 php 和一些循环,我已经使用您建议的 mysql 代码完成了它。所以它不再需要了,但我想知道它是否可以完成以及如何只使用 mysql。
【解决方案2】:

您可以对自身使用空检查和LEFT JOIN

SELECT IF(parent.ID IS NULL, 'MAIN', 'SUB') as grouping, page.*, parent.*
FROM pages as page
LEFT JOIN pages as parent
ON page.parent_id = parent.ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多