按 MySql 中的多个查询排序

ORDER by multiple queries in MySql

我正在尝试构建一个聊天列表页面,其中最新的 sent/received 联系人显示在顶部 table。为此,我有一个 table smshistory,我在其中存储 sent/received 带有号码的短信,其中一个是公司 phone,另一个是客户 phone 号码

CREATE TABLE IF NOT EXISTS `smshistory` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fromnumber` varchar(20) NOT NULL,
  `tonumber` varchar(20) NOT NULL,
  `sms` varchar(20) NOT NULL,
  `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `smshistory`
--

INSERT INTO `smshistory` (`id`, `fromnumber`, `tonumber`, `sms`, `added`) VALUES
(1, 'companynum', 'client1num', 'Hello', '2021-07-16 12:28:23'),
(2, 'companynum', 'client2num', 'Hello', '2021-07-16 12:28:23'),
(3, 'companynum', 'client3num', 'Hello', '2021-07-16 12:28:23'),
(4, 'client1num', 'companynum', 'Hi', '2021-07-16 12:28:23'),
(5, 'companynum', 'client1num', 'Hello', '2021-07-16 12:28:23'),
(6, 'client1num', 'companynum', 'Hi', '2021-07-16 12:28:23'),
(7, 'client2num', 'companynum', 'Hi', '2021-07-16 12:28:23'),
(8, 'companynum', 'client2num', 'Hello', '2021-07-16 12:28:23'),
(9, 'client3num', 'companynum', 'Hi', '2021-07-16 12:28:23');

由于第一条消息总是来自公司编号,所以我显示 DISTINCT 列表:

SELECT DISTINCT (`tonumber`) FROM `smshistory` WHERE `fromnumber` = $companynum

这给了我这样的列表:

client1num
client2num
client3num

要求:

我需要的是按 added DESC 列的顺序显示 DISTINCT,如果客户的号码在 fromnumbertonumber 中,它应该显示在顶部。所以,根据我的table,结果应该是:

client3num
client2num
client1num

Fiddle 在 http://sqlfiddle.com/#!9/4256d1d/1

知道如何实现吗?

在回答问题 'How do I sort a de-normalised collection of strings (that a follow a very constrained pattern) according to the numerals contained within those strings?' 时,这里有一个方法...

DROP TABLE IF EXISTS x;

CREATE TABLE x
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,bad_string VARCHAR(20) NOT NULL
);

INSERT INTO x VALUES (11,'client2num'),(17,'client3num'),(21,'client1num');

SELECT REPLACE(REPLACE(bad_string,'client',''),'num','') p FROM x;
+---+
| p |
+---+
| 2 |
| 3 |
| 1 |
+---+

...可以改写为:

SELECT * FROM x ORDER BY REPLACE(REPLACE(bad_string,'client',''),'num','') DESC;
+----+------------+
| id | bad_string |
+----+------------+
| 17 | client3num |
| 11 | client2num |
| 21 | client1num |
+----+------------+

对于 fromnumbertonumber 中包含 $companynum 的每一行,您必须使用 CASE 表达式提取客户号码并使用 GROUP BY 删除重复项。
最后将结果按added:

的最大值排序
SELECT CASE WHEN fromnumber = $companynum THEN tonumber ELSE fromnumber END client_num
FROM smshistory
WHERE $companynum IN (fromnumber, tonumber)
GROUP BY client_num
ORDER BY MAX(added) DESC

要回答您的问题,您可以使用以下查询:

SELECT distinct client_num from ( 
SELECT CASE WHEN fromnumber = 'companynum' THEN tonumber 
ELSE fromnumber END client_num 
FROM smshistory ORDER BY id DESC ) as a