【问题标题】:SQL query to select group then order from 2 tablesSQL查询选择组然后从2个表中排序
【发布时间】:2021-02-18 12:07:30
【问题描述】:

这是表格

标签:

tag_id tag_name
1 SENT
2 AIRTIME
3 RECEIVED
4 KOPOKOPO
5 RESTAURANT
6 PAID
7 UBER

TRANS_TAG

tag_id trans_id
1 1
2 1
3 1
4 1
5 1
6 1
1 2
2 2
3 2
4 2
5 2
6 2

以下是默认标签(SENT、AIRTIME、RECEIVED、PAID),其余不是默认标签。 TRANS_TAG 表跟踪事务 id 和附加到它的标签。

我想写一个select SQL语句,从这两个表中进行选择,得到如下结果。 - 它返回已附加到至少一个事务的所有标签的列表。然后它按字母顺序排列它们,但首先与默认标签分组。

这是想要的结果

tag_name
AIRTIME
PAID
RECIVED
SENT
KOPOKOPO
RESTAURANT

这是我目前的代码

String SQL = "SELECT "
                + KEY_TAG_TITLE +
            " FROM " + TABLE_TRANS_TAG
          + " INNER JOIN " + TABLE_TAG + " " + "ON " + TABLE_TRANS_TAG + "." + KEY_TRANS_TAG_TAG_ID
                + " = " + TABLE_TAG + "." + KEY_TAG_ID
          + " GROUP BY " + KEY_TAG_TITLE
          + " ORDER BY " + TABLE_TAG + "." + KEY_TAG_TITLE + " ASC, " + TABLE_TAG + "." + KEY_ROW_ID + " ASC";

【问题讨论】:

    标签: sql sqlite sql-order-by


    【解决方案1】:

    你可以使用:

    SELECT T.KEY_TAG_TITLE
    FROM TABLE_TRANS_TAG TT INNER JOIN
         TABLE_TAG T
         ON TT.KEY_TRANS_TAG_TAG_ID = T.KEY_TAG_ID
    GROUP BY T.KEY_TAG_TITLE
    ORDER BY (CASE WHEN T.KEY_TAG_TITLE IN ('SENT', 'AIRTIME', 'RECEIVED', 'PAID') THEN 1 ELSE 2 END),
             T.KEY_TAG_TITLE;
    

    【讨论】:

      【解决方案2】:

      不要对如此简单的需求使用连接和聚合。
      这会导致性能不佳。

      使用EXISTS 和条件排序:

      String SQL = "SELECT tg." + KEY_TAG_TITLE + " " +
                   "FROM " + TABLE_TAG + " AS tg " +
                   "WHERE EXISTS (SELECT 1 FROM " + TABLE_TRANS_TAG + " AS tr WHERE tr." + KEY_TRANS_TAG_TAG_ID + " = tg." + KEY_TAG_ID + ") " +
                   "ORDER BY tg." + KEY_TAG_TITLE + " IN ('SENT', 'AIRTIME', 'RECEIVED', 'PAID') DESC, tg." + KEY_TAG_TITLE;
      

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        相关资源
        最近更新 更多