我可以在临时表变量上使用 substring() 吗?

Posted

技术标签:

【中文标题】我可以在临时表变量上使用 substring() 吗?【英文标题】:Can I use substring() on a temporary table variable? 【发布时间】:2020-08-01 09:14:15 【问题描述】:

我使用以下方法按每个域组的最高分对数据进行排序:

SELECT * from `Inputs` t 
order by (select max(`score`) from `Inputs` t1 where t1.`domain`=t.`domain`) desc, `score` desc

结果是:

query domain url score  
a www.google.com www.google.com/a  3  
a www.google.com www.google.com/b  1
a www.facebook.com www.google.com/c 2 

我不想将域和 url 存储在数据库中,而是使用以下方法计算域作为查询中 url 的函数:

SUBSTRING(`url` from 1 for locate('/',`url` ,10)-1) as `domain`

如果可能,我将能够使用更少的列来实现相同的条目顺序(如上所示):

query url score  
a www.google.com/a  3  
a www.google.com/b  1
a www.google.com/c 2 

如果可能的话,有谁知道这是如何实现的?我没有在 *** 上找到其他关于使用临时表的列别名的问题。

我尝试嵌套另一个查询,但没有运气:

SELECT *, SUBSTRING(`url` from 1 for locate('/',`url` ,10)-1) as `domain` from `Inputs` t
order by (select max(`score`), 
(select SUBSTRING(`url` from 1 for locate('/',`url` ,10)-1) as `domain` from `Inputs` t1 )
 from `Inputs` t1 where t1.`domain`=t.`domain`) asc, `score` asc

【问题讨论】:

你真的不止一次地问同样的问题,并且接受(有时)一个答案,在被问到之后改变问题,并且有人要求更多信息,就开始无视他吗? (参考1:***.com/questions/63202363/…;参考2:***.com/questions/63193038/…) 【参考方案1】:

您可以为此目的使用 [substring_Index][1],但您最终必须更改 CHAR 的数据类型或站点

实际上不需要该函数使代码更具可读性

架构 (MySQL v5.7)

CREATE TABLE Inputs (
  `query` VARCHAR(1),
  `domain` VARCHAR(16),
  `url` VARCHAR(16),
  `score` INTEGER
);

INSERT INTO Inputs
  (`query`, `domain`, `url`, `score`)
VALUES
  ('a', 'www.google.com', 'www.google.com/a', '3'),
  ('a', 'www.google.com', 'www.google.com/b', '1'),
  ('a', 'www.facebook.com', 'www.google.com/c', '2');
  
CREATE FUNCTION geturl (_url CHAR(255))
       RETURNS CHAR(255) DETERMINISTIC
       RETURN SUBSTRING_INDEX(_url, "/", 1);

查询 #1

select `query`, `domain`, `url` , `score`
from Inputs t
order by 
    (select max(score) from Inputs t1 where geturl(t1.url) = geturl(t.url)) desc,
    score desc;

| query | domain           | url              | score |
| ----- | ---------------- | ---------------- | ----- |
| a     | www.google.com   | www.google.com/a | 3     |
| a     | www.facebook.com | www.google.com/c | 2     |
| a     | www.google.com   | www.google.com/b | 1     |

View on DB Fiddle

【讨论】:

嘿@nbk。为混乱道歉。我不想创建一个函数,然后调用。我想将原始排序查询与 substring() 函数结合起来。我已经更新了我的问题,以包括我对代码可能是什么样子的尝试。希望这会有所帮助。 ülease 显示你想要得到的 wjat 结果,因为我不知道第二个订单应该是什么。 订购结果没有改变,@nbk。我需要在我的数据库中保存以实现该结果的数据(我不需要域列来对条目进行分组,因为我是从 url 派生域)。我已经更新了我的问题以反映这一点。 你注意到你不能这样做,除了你按最大值排序之外,不起作用。排序必须是可枚举的,可以排序的,并且最大值不是其中之一,所以请准确解释是什么使得这个顺序仍然很不清楚,可能是另一个域' 更多信息:***.com/questions/63193038/…

以上是关于我可以在临时表变量上使用 substring() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql server 表变量表类型临时表

SQL Server 表变量和临时表的区别

为啥声明表变量与临时表相比非常慢?

sqlserver 表循环-游标表变量临时表

[MSSQL]表变量和临时表的区别

sql: 临时表与表变量的区别