如何在where语句mysql中找到不同的通配符

问题描述 投票:1回答:4
 CREATE TABLE table1
        (`id` int not null auto_increment primary key, `data` char(3),`subject` varchar(250)) ;

INSERT INTO table1
    (`id`, `data`,`subject`)
VALUES
    (1, 'xa','aad'),
    (2, 'ya','aac'),
    (3, 'yc','aae'),
    (4, 'zb','aaf'),
    (5, 'yb','aag'),
    (6, 'xc','aah'),
    (7, 'za','aai');

如表中所示,如何找到以数据列中第一个字母开头的所有不同值

例如:

select * from table1 where data like '%x%' limit 1;
select * from table1 where data like '%y%' limit 1;
select * from table1 where data like '%z%' limit 1;

在一个单一的查询中获取此输出,如下所示

产量

1, 'xa', 'aad'
2, 'ya','aac'
3, 'zb','aaf'

sql fiddle

mysql
4个回答
1
投票

组合DISTINCTLEFT?但是不要忘记索引不适用于这种方法。

SELECT distinct(LEFT(`data`, 1)) first_letter, id, `data`, subject 
FROM table1
GROUP BY first_letter

http://sqlfiddle.com/#!9/08235/5/0


1
投票

在单个查询中进行

select 
  id,
  data,
  LEFT(group_concat(subject order by id),LOCATE(',',group_concat(subject order by id)) - 1),
from table1
group by SUBSTRING(data, 1, 1)

0
投票

您可以使用子查询来获得每组的第一个id

SELECT *
FROM table1
WHERE id IN (
select min(id) from table1
where data like '%x%'
OR data like '%y%'
OR data like '%z%'
GROUP BY left(data, 1)
)

Fiddle


-1
投票

使用UNION

(select * from table1 where data like '%x%' limit 1) 
UNION ALL
(select * from table1 where data like '%y%' limit 1) 
UNION ALL
(select * from table1 where data like '%z%' limit 1) ;

updated fiddle

请注意:您必须将每个查询括在()中以限制每个查询的工作,否则您将只获得一行而不是三行。

另请注意,'%z%'将为您提供在任何位置包含z的值,而不仅仅是第一个字符。你需要使用LEFT(data, 1) = 'z'代替:

(select * from table1 where LEFT(data, 1) = 'x' limit 1 ) 
UNION ALL
(select * from table1 where  LEFT(data, 1) = 'y' limit 1) 
UNION ALL
(select * from table1 where  LEFT(data, 1) = 'z' limit 1 ) 

updated fiddle 2

© www.soinside.com 2019 - 2024. All rights reserved.