【问题标题】:SELECT * FROM table WHERE field IN (SELECT id FROM table ORDER BY field2)SELECT * FROM table WHERE field IN (SELECT id FROM table ORDER BY field2)
【发布时间】:2011-04-06 06:01:36
【问题描述】:

我有 4 张桌子:

categories - id, position
subcategories - id, categories_id, position
sub_subcategories - id, subcategories_id, position
product - id, sub_subcategories_id, prod_pos

现在我正在做测试以找出我的查询出了什么问题。

所以我想选择 sub_subcategories,并得到类似的东西:

[[1,2,3,4,5,6], [1,2,3,4,5,6,7]], [[1,2,3,4,5,6], [1,2,3,4]]

每个 [] 表示:大 - 类别,小 - 子类别,数字在 sub_subcategories 中的位置。我希望 [] 按其“位置”字段排序,因此查询:

SELECT id FROM sub_subcategories_id 
WHERE subcategories_id IN (
       SELECT id 
       FROM subcategories_id 
       WHERE categories_id IN (
            SELECT id FROM categories 
            WHERE id = 'X' ORDER BY position) 
            ORDER BY position) 
ORDER BY position

有点错误,因为我明白了:

1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,6,6,6,7

不知道为什么 - 最后一个“按位置排序”会破坏一切吗?

【问题讨论】:

标签: php sql mysql select


【解决方案1】:

就目前而言,您的查询永远不会按原样返回“一组”数字。如果你忽略所有的子选择,你实际上是在做:

SELECT id FROM sub_subcategories_id 
ORDER BY position

只会返回一列:sub_sub_categories_id。你最好做这样的事情:

SELECT cat.id, subcat.id, subsubcat.id
FROM sub_sub_categories AS subsubcat
LEFT JOIN sub_categories AS subcat ON subcat.id = subsubcat.subcategories.id
LEFT JOIN categories AS cat ON cat.id = subcat.category_id
WHERE (cat.id = 'X')
ORDER BY cat.id, subcat.id, subsubcat.id

这将返回按各种 ID 排序的 3 列。如果您不需要单独的 sub_sub_categories 值,而只想将它们作为单个字符串值,则可以使用 GROUP_CONCAT() 并进行各种分组:

   SELECT cat.id, subcat.id, GROUP_CONCAT(subsubcat.id)
   FROM ...
   ...
   WHERE (cat.id = 'X')
   GROUP BY cat.id, subcat.id, subsubcat.id
   ORDER BY ...

【讨论】:

    【解决方案2】:

    您需要在最外层查询中应用所有所需的排序 - 子查询中的排序没有任何意义 - 问题“此 ID 在 中吗?”答案是一样的,不管列表的顺序是什么(确实,更多的属性,是一个集合,没有顺序)。

    因此,您需要在最外层查询中获取所有需要排序的列。

    类似:

    SELECT ssi.ID
    from
        sub_subcategories_id ssi
            inner join
        subcategories_id si
            on
                ssi.subcategories_id = si.id
            inner join
        categories c
            on
               si.categories_id = c.id
    where
        c.id = 'X'
    order by
        c.position,
        si.position,
        ssi.position
    

    【讨论】:

      猜你喜欢
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多