代码之家  ›  专栏  ›  技术社区  ›  Jannie Theunissen

如何在不选择“排序依据”字段的情况下选择不同的行

  •  2
  • Jannie Theunissen  · 技术社区  · 14 年前

    所以我有两张桌子,学生(pk-sid)和导师(pk-pid)。此查询

    SELECT s.pID
    FROM students s JOIN mentors m ON s.pID = m.pID
    WHERE m.tags LIKE '%a%'
    ORDER BY s.sID DESC;
    

    提供这个结果

    pID
    -------------
    9
    9
    3
    9
    3
    9
    9
    9
    10
    9
    3
    10  etc...
    

    我正试图通过这个顺序获得一个不同的导师ID列表,所以我正在寻找SQL来生成

    pID
    -------------
    9
    3
    10
    

    如果我只是在select子句中插入一个distinct,就会得到意外的结果10、9、3(顺序错误)。任何帮助都非常感谢。

    6 回复  |  直到 14 年前
        1
  •  4
  •   Anthony Faull    14 年前
    SELECT s.pID
    FROM students s JOIN mentors m ON s.pID = m.pID   
    WHERE m.tags LIKE '%a%'
    GROUP BY s.pID
    ORDER BY MAX(s.sID) DESC
    
        2
  •  4
  •   wRAR    14 年前

    如果不使用 ORDER BY 因为然后数据库引擎决定返回它们的顺序。

        3
  •  1
  •   dkamins    14 年前

    试试这个:

    SELECT s.pID
    FROM students s JOIN mentors m ON s.pID = m.pID
    WHERE m.tags LIKE '%a%'
    GROUP BY s.pID
    ORDER BY s.sID DESC;
    

    也就是说,group by而不是distinct应该保持顺序。

        4
  •  0
  •   Salil    14 年前

    在使用distinct“order by s.sid desc;”之后,将不起作用,因此请尝试使用如下所示的somwthing

    SELECT distinct(s.pID) as PID
    FROM students s JOIN mentors m ON s.pID = m.pID
    WHERE m.tags LIKE '%a%'
    ORDER BY PID;
    

    这将返回3、9、10

        5
  •  0
  •   Veer    14 年前

    用这个

    SELECT DISTINCT s.pID as PID
    FROM students s JOIN mentors m ON s.pID = m.pID
    WHERE m.tags LIKE '%a%'
    ORDER BY s.sID DESC,1;
    
        6
  •  0
  •   Jannie Theunissen    14 年前

    再挣扎一下我就有这个了

    SELECT s.pID, MAX(s.sID) AS newest_student
    FROM students s JOIN mentors m ON s.pID = m.pID
    WHERE m.tags LIKE '%a%'
    GROUP BY s.pID
    ORDER BY newest_student DESC;
    

    它给了我所需要的9,3,10,但我有一个无用的字段与它一起返回。 我希望有人能提供更好的解决方案。