MYSQL 排序依据 - 遵循某种模式
MYSQL order by - to follow a pattern
我们如何设置模式,以便 select 编辑或保存在变量中。
所以基本上当我 select 数据时,它的顺序如下。
customer ID Email
1 test@gmail.com
2 test@hotmail.com
3 test@yahoo.com
4 test@seznam.cz
所以我要select所有记录在table!但是我想订购它们,所以它们遵循这种格式
customer ID Email
1 test@gmail.com
2 test@hotmail.com
3 test@yahoo.com
4 test@seznam.cz
52 test2@gmail.com
7 test2@hotmail.com
84 test2@yahoo.com
99 test2@seznam.cz
10 test3@gmail.com
11 test3@hotmail.com
124 test3@yahoo.com
1321 test3@seznam.cz
那么如何设置我的查询以使我的结果遵循类似的顺序。我基本上想知道如何 select(或一旦存储就处理)数据库中的数据以遵循特定模式。
编辑:
这是我正在尝试的脚本,它确实可以部分工作,但是数据不符合模式。
SELECT DISTINCT customer_id, email
FROM customer_1_tbl
WHERE customer_id IN (
SELECT cust.customer_id
FROM customer_1_binding_tbl AS cust
WHERE cust.mailinglist_id = '2') order by substring_index(email, '@', 1),
(case substring_index(email, '@', -1)
when ('gmail.com' or 'hotmail.com' or 'jednotavimperk.cz') then 1
when ('seznam.cz' or 'email.cz' or 'post.cz') then 2
when 'tiscali.cz' then 3
when ('centrum.cz' or 'atlas.cz' or 'volny.cz') then 4
else 999
end)
您可以分开 email
列。然后,使用 case
分配排序优先级:
order by substring_index(email, '@', 1),
(case substring_index(email, '@', -1)
when 'gmail.com' then 1
when 'hotmail.com' then 2
when 'yahoo.com' then 3
when 'seznam.cz' then 4
else 999
end)
另一个方便的函数是 field()
。但是,对于不匹配项,它不会为您提供 else
子句的简单选项。
编辑:
您编辑的代码是错误的。这不是您在 case
中表达多个条件的方式。试试这个:
order by substring_index(email, '@', 1),
(case when substring_index(email, '@', -1) in ('gmail.com', 'hotmail.com', 'jednotavimperk.cz') then 1
when substring_index(email, '@', -1) in ('seznam.cz', 'email.cz', 'post.cz') then 2
when substring_index(email, '@', -1) = 'tiscali.cz' then 3
when substring_index(email, '@', -1) in ('centrum.cz', 'atlas.cz', 'volny.cz') then 4
else 999
end)
我们如何设置模式,以便 select 编辑或保存在变量中。
所以基本上当我 select 数据时,它的顺序如下。
customer ID Email
1 test@gmail.com
2 test@hotmail.com
3 test@yahoo.com
4 test@seznam.cz
所以我要select所有记录在table!但是我想订购它们,所以它们遵循这种格式
customer ID Email
1 test@gmail.com
2 test@hotmail.com
3 test@yahoo.com
4 test@seznam.cz
52 test2@gmail.com
7 test2@hotmail.com
84 test2@yahoo.com
99 test2@seznam.cz
10 test3@gmail.com
11 test3@hotmail.com
124 test3@yahoo.com
1321 test3@seznam.cz
那么如何设置我的查询以使我的结果遵循类似的顺序。我基本上想知道如何 select(或一旦存储就处理)数据库中的数据以遵循特定模式。
编辑:
这是我正在尝试的脚本,它确实可以部分工作,但是数据不符合模式。
SELECT DISTINCT customer_id, email
FROM customer_1_tbl
WHERE customer_id IN (
SELECT cust.customer_id
FROM customer_1_binding_tbl AS cust
WHERE cust.mailinglist_id = '2') order by substring_index(email, '@', 1),
(case substring_index(email, '@', -1)
when ('gmail.com' or 'hotmail.com' or 'jednotavimperk.cz') then 1
when ('seznam.cz' or 'email.cz' or 'post.cz') then 2
when 'tiscali.cz' then 3
when ('centrum.cz' or 'atlas.cz' or 'volny.cz') then 4
else 999
end)
您可以分开 email
列。然后,使用 case
分配排序优先级:
order by substring_index(email, '@', 1),
(case substring_index(email, '@', -1)
when 'gmail.com' then 1
when 'hotmail.com' then 2
when 'yahoo.com' then 3
when 'seznam.cz' then 4
else 999
end)
另一个方便的函数是 field()
。但是,对于不匹配项,它不会为您提供 else
子句的简单选项。
编辑:
您编辑的代码是错误的。这不是您在 case
中表达多个条件的方式。试试这个:
order by substring_index(email, '@', 1),
(case when substring_index(email, '@', -1) in ('gmail.com', 'hotmail.com', 'jednotavimperk.cz') then 1
when substring_index(email, '@', -1) in ('seznam.cz', 'email.cz', 'post.cz') then 2
when substring_index(email, '@', -1) = 'tiscali.cz' then 3
when substring_index(email, '@', -1) in ('centrum.cz', 'atlas.cz', 'volny.cz') then 4
else 999
end)