Могу ли я использовать substring () для переменной временной таблицы? - PullRequest
0 голосов
/ 01 августа 2020

Я сортирую данные по наивысшему баллу каждой группы доменов, используя:

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 

Кто-нибудь знает, как это достигается, если это возможно? Я не нашел других вопросов по stackoverflow об использовании псевдонимов столбцов для временных таблиц.

Я попытался вложить другой запрос, но безуспешно:

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 Ответ

1 голос
/ 01 августа 2020

вы можете использовать [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     |

Просмотр в DB Fiddle

...