首页 新闻 赞助 找找看

mysql中一个字段同时满足多个条件,(3个以上)

0
悬赏园豆:10 [已解决问题] 解决于 2018-12-28 14:45

mysql中一个字段同时满足多个条件,(3个以上),该如何写?

问题补充:

比如说一个字段user_name它满足user_name = '1' and user_name = '2' and user_name = '3',
这样的,但是我的关键字有很多,我也不可能一个一个的写出来,所以有什么办法解决吗?
为了看仔细我将三张表及关联后的数据已发上

子堇的主页 子堇 | 初学一级 | 园豆:161
提问于:2018-12-28 12:41
< >
分享
最佳答案
0

CASE status
WHEN 0 THEN '我是0'
WHEN 1 THEN '我是1'
WHEN 2 THEN '我是2'
ELSE
END

这样吗?

收获园豆:10
xiaobaiskill | 小虾三级 |园豆:1087 | 2018-12-28 13:01

不是,有好多,不止3个

子堇 | 园豆:161 (初学一级) | 2018-12-28 13:44

CASE status
WHEN 0 THEN '我是0'
WHEN 1 THEN '我是1'
WHEN 2 THEN '我是2'
WHEN 3 THEN '我是3'
WHEN 4 THEN '我是4'
WHEN 5 THEN '我是5'
....
ELSE
'其他'
END

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 13:48

@xiaobaiskill: 如果说,我又100个呢?

子堇 | 园豆:161 (初学一级) | 2018-12-28 13:49

where status in(0,1,2,3,4)

用in

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 13:51

@xiaobaiskill: in不是同时满足呀,条件为0.1.2.3.4时,这个字段就必须为0.1.2.3.4同时存在的,只有一个是不行的

子堇 | 园豆:161 (初学一级) | 2018-12-28 13:53

@风轻殇: 怎么可能一个字段即使这个又是哪个,你把数据拿出来给我们看一下

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 13:54

@xiaobaiskill:

这是两张表的关联后的数据,现在是labelName = 9 and labelname = 108 时显示第一条,
当labelName = 9 and labelname = 23时显示第二条数据,类似很多种组合查找

子堇 | 园豆:161 (初学一级) | 2018-12-28 13:59

@xiaobaiskill: 我不可能每出现一种情况就写一遍吧,帮忙啦,新手

子堇 | 园豆:161 (初学一级) | 2018-12-28 14:00

@风轻殇: 感觉用法怪怪的,你那个sql 语句是怎么写的?

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 14:04

@xiaobaiskill:

    SELECT
        p.id,
        p.musicName,
        p.writeMusic,
        p.writeWords,
        p.compose,
        p.sing,
        p.workUrl,
        p.musicUrl,
        p.userId,
        IFNULL(p.record, '0') record,
        IFNULL(p.frequency, '0') frequency,
        GROUP_CONCAT(
            DISTINCT (p.labelSetId) SEPARATOR '/'
        ) labelSetId,
        GROUP_CONCAT(p.labelName SEPARATOR '/') labelName,
        GROUP_CONCAT(
            DISTINCT (p.label_name) SEPARATOR '/'
        ) label
    FROM
        (
            SELECT
                m.id,
                m.music_name musicName,
                m.write_music writeMusic,
                m.write_words writeWords,
                m.compose,
                m.sing,
                m.record,
                m.work_url workUrl,
                m.music_url musicUrl,
                m.user_id userId,
                m.frequency,
                m.music_time,
                l.label_name labelName,
                ls.label_name labelName2,
                label.label_name,
                l.label_set_id labelSetId
            FROM
                music_library m
            LEFT JOIN music_label l ON m.id = l.library_id
            LEFT JOIN label ON label.id = l.label_name
            LEFT JOIN (
                SELECT
                    library_id libraryId,
                    label_name
                FROM
                    music_label
                WHERE
                    label_set_id = 1
            ) ls ON ls.libraryId = l.library_id
        ) p
    WHERE p.musicUrl <> "" 
    GROUP BY p.id

LIMIT 0,10

子堇 | 园豆:161 (初学一级) | 2018-12-28 14:06

@风轻殇: 你为什么不分几次查呢,写在一个sql 里面,极大的降低了你的查询效率,很蛋疼呀。你要的结果是什么?

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 14:15

@xiaobaiskill: 比如说十个数,我点击1和2能查到有1和2的数据,我点击1,2,3就能得到同时满足1,2,3的数据,有1的,有2的,有1,2的都不会出来,不知道说的是否够清楚

子堇 | 园豆:161 (初学一级) | 2018-12-28 14:21

@风轻殇: select * from table where filed in (1,2,3) group filed_id having count(filed) = 3

我这样写能明白吗?
就是首先查出 filed 满足(1,2,3) 的条件,然后以filed_id 分组(filed_id 每一组中的field 都不会重复)
然后根据每一组的filed 个数判断,如果正好3个那么久必然是1,2,3。如果不是就肯定是少的。

局限性:必须保证filed_id 的分组中field 是唯一的

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-28 14:31

@xiaobaiskill: 试了,好用,十分感谢

    SELECT
        p.id,
        p.musicName,
        p.writeMusic,
        p.writeWords,
        p.compose,
        p.sing,
        p.workUrl,
        p.musicUrl,
        p.userId,
        IFNULL(p.record, '0') record,
        IFNULL(p.frequency, '0') frequency,
        GROUP_CONCAT(
            DISTINCT (p.labelSetId) SEPARATOR '/'
        ) labelSetId,
        GROUP_CONCAT(p.labelName SEPARATOR '/') labelName,
        GROUP_CONCAT(
            DISTINCT (p.label_name) SEPARATOR '/'
        ) label
    FROM
        (
            SELECT
                m.id,
                m.music_name musicName,
                m.write_music writeMusic,
                m.write_words writeWords,
                m.compose,
                m.sing,
                m.record,
                m.work_url workUrl,
                m.music_url musicUrl,
                m.user_id userId,
                m.frequency,
                m.music_time,
                l.label_name labelName,
                ls.label_name labelName2,
                label.label_name,
                l.label_set_id labelSetId
            FROM
                music_library m
            LEFT JOIN music_label l ON m.id = l.library_id
            LEFT JOIN label ON label.id = l.label_name
            LEFT JOIN (
                SELECT
                    library_id libraryId,
                    label_name
                FROM
                    music_label
                WHERE
                    label_set_id = 1
            ) ls ON ls.libraryId = l.library_id
        ) p
    WHERE p.musicUrl <> "" AND p.labelName  in (110,109,39,69) 
    GROUP BY p.id HAVING COUNT(p.labelName)=4

LIMIT 0,10

子堇 | 园豆:161 (初学一级) | 2018-12-28 14:44
其他回答(4)
0

字段=1 or字段=2 or字段=3
字段 in(1,2,3)
字段 =1
union
字段=2
union
字段=3

吴瑞祥 | 园豆:29449 (高人七级) | 2018-12-28 13:12

不是or的关系,一个字段同时满足多个关键字,

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 13:43
0
ycyzharry | 园豆:25639 (高人七级) | 2018-12-28 13:45

不对,比如说一个字段user_name它满足user_name = '1' and user_name = '2' and user_name = '3',
这样的,但是我的关键字有很多,我也不可能一个一个的写出来,所以有什么办法解决吗?

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 13:48
0

where f like '%1%' and f like '%2%' and f like '%3%'

会长 | 园豆:12401 (专家六级) | 2018-12-28 13:49

如果说我有几十个,甚至更多呢?

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 13:50

@风轻殇: 用代码拼sql

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-12-28 15:31

@会长: 已经结贴了,问题解决,谢谢了

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 15:34

@风轻殇: 其实你这个设计违反了数据库第一范式,为什么不把那个label单独设计为一个表,这样是更常见的做法

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-12-28 15:35

@会长: 总共4张表,label,label_set,music_label,music_library,四张,

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 15:37

@风轻殇: 应该有一个表示多对多的关联方,而不是把所有label放到一个field里。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-12-28 16:30

@会长: music_label就是那个多对多的张表进行关联的

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 16:34

@风轻殇: 数据库第一范式,了解一下

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-12-29 09:26
0

你是不是想说的是通过代码实现 sql 拼接。。。。。

waiter | 园豆:1000 (小虾三级) | 2018-12-28 14:34

已经拼接完了,现在是实现查询条件

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 14:36

@风轻殇: 你目前关注的问题是什么?
如果是查询字段或者条件太多,想在编码的时候偷个懒,写个方法动态组成语句。
如果是查询字段或者条件太多,考虑到编码质量等原因,可以考虑在软件设计、代码设计和实现上处理下。

支持(0) 反对(0) waiter | 园豆:1000 (小虾三级) | 2018-12-28 14:52

@waiter: 不用了,已经结贴,谢谢

支持(0) 反对(0) 子堇 | 园豆:161 (初学一级) | 2018-12-28 14:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册