【发布时间】:2016-10-30 22:01:43
【问题描述】:
请注意,输出已被“风格化”,因此在 SO 上阅读效果更好。
我有什么...
(sql/format
(->
(sqlh/select :*)
(sqlh/from :event)
(sqlh/merge-where [:in :field_id ["1673576", "1945627", "1338971"]])
(sqlh/merge-where [:in :layer ["fha.abs" "fha.rank" "fha.true-color"]])
(sqlh/merge-order-by :field_id)
(sqlh/merge-order-by :layer)
(sqlh/merge-order-by :event_date)
(sqlh/limit 5)))
=>
["SELECT *
FROM event
WHERE ((field_id in (?, ?, ?)) AND (layer in (?, ?, ?)))
ORDER BY field_id, layer, event_date
LIMIT ?"
"1673576"
"1945627"
"1338971"
"fha.abs"
"fha.rank"
"fha.true-color"
5]
我想要什么...
(sql/format
(->
(sqlh/select :*)
(sqlh/from :event)
(sqlh/merge-where [:in :field_id ["1673576", "1945627", "1338971"]])
(sqlh/merge-where [:in :layer ["fha.abs" "fha.rank" "fha.true-color"]])
;;; this doesn't work, but is conceptually what I'm looking for
(sqlh/merge-order-by [:field_id :layer :event_date])
(sqlh/limit 5)))
=>
["SELECT *
FROM event
WHERE ((field_id in (?, ?, ?)) AND (layer in (?, ?, ?)))
ORDER BY (field_id, layer, event_date)
LIMIT ?"
"1673576"
"1945627"
"1338971"
"fha.abs"
"fha.rank"
"fha.true-color"
5]
如何让 HoneySQL 发出将我的 order by 子句视为表本身用作主键的复合键的 SQL?
似乎 HoneySQL 应该能够做到这一点,因为当在 where 子句中遇到相同的挑战时,它“做正确的事”......
(sql/format
(->
(sqlh/select :*)
(sqlh/from :event)
(sqlh/merge-where [:= [:field_id :layer :event_date] ["1338971" "fha.abs" (c/from-string "2011-08-02T10:54:55-07")]])))
=>
["SELECT * FROM event WHERE (field_id, layer, event_date) = (?, ?, ?)"
"1338971"
"fha.abs"
#object[org.joda.time.DateTime 0xe59f807 "2011-08-02T17:54:55.000Z"]]
【问题讨论】:
-
第二个生成的查询与第一个有什么不同?
-
@AshishNegi 在第二个查询中,order by 子句位于一个元组而不是 3 个单独的字段上。最终,这将允许我在单个语句中反转排序顺序。
-
是的,但不是都给出相同的结果?...无论您有元组还是单个字段。
-
@AshishNegi 它给出了相同的初始结果,这是正确的,但是当我期待我想要做的事情时;实现一个只需要 LIMIT 而不是 OFFSET 的分页解决方案,我需要能够将这 3 个不同的字段视为一个单元。 HoneySQL 在 where 子句中对此做了正确的事情(我在问题中添加了这个),我正在寻找 order-by 中的等效行为。
-
也许你应该尝试提出关于限制/偏移的真正问题,以及他们如何在有/没有元组的情况下给出不同的结果..