我知道这个问题已经被问过好几次了,我已经阅读了所有的答案,但似乎没有一个能完全解决我的问题。
我正在从 mySQL 数据库切换到 MS Access 数据库。在这两种情况下,我都使用 php 脚本连接到数据库并执行 SQL 查询。
我需要为以前在 mySQL 上执行的查询找到合适的替代品。我想要:
- 执行第一个查询并根据其中一个列按字母顺序排列记录
- 构造一个反映先前字母顺序的 ID 列表
- 使用与 ID 列表一起应用并按此列表排序的 IN 子句执行第二个查询。
在 mySQL 中,我曾经以这种方式执行最后一个查询:
SELECT name FROM users WHERE id IN ($name_ids) ORDER BY FIND_IN_SET(id,'$name_ids')
由于FIND_IN_SET
仅在 mySQL中可用CHARINDEX
并且PATINDEX
在我的 php 脚本中不可用,我该如何实现呢?
我知道我可以写如下内容:
SELECT name
FROM users
WHERE id IN ($name_ids)
ORDER BY CASE id
WHEN ... THEN 1
WHEN ... THEN 2
WHEN ... THEN 3
WHEN ... THEN 4
END
但你必须考虑到:
- ID 的列表具有可变长度和元素,因为它取决于第一个查询
- 该列表可以轻松包含数千个元素
你对此有什么暗示吗?有没有办法以编程方式构造ORDER BY CASE ... WHEN ...
语句?由于我的 ID 列表可能很大,有没有更好的方法?
更新:我执行两个单独的查询,因为我需要访问两个不同的表。数据库不是很简单,所以我试着举个例子:假设我有一个包含用户列表的表和一个包含每个用户书架中所有书籍的表。
由于数据库是在 mySQL 中设计的,因此对于每条图书记录,我将 user_id 存储在图书表中,以便在用户和图书之间建立关系。
现在假设我想获取所有用户的列表,这些用户的书籍的标题以字母“a”开头,并且我想根据书籍的字母顺序对用户进行排序。这就是我所做的:
- 执行第一个查询以查找所有以字母“a”开头的书籍并按字母顺序排序
- 创建一个 user_id 列表,该列表应反映书籍的字母顺序
- 在 users 表中执行查询以找出用户名并使用 user_id 列表对它们进行排序以按书籍进行所需的排序
希望这能澄清我的需要。