mysql中一个字段同时满足多个条件,(3个以上),该如何写?
比如说一个字段user_name它满足user_name = '1' and user_name = '2' and user_name = '3',
这样的,但是我的关键字有很多,我也不可能一个一个的写出来,所以有什么办法解决吗?
为了看仔细我将三张表及关联后的数据已发上
CASE status
WHEN 0 THEN '我是0'
WHEN 1 THEN '我是1'
WHEN 2 THEN '我是2'
ELSE
END
这样吗?
不是,有好多,不止3个
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: 如果说,我又100个呢?
where status in(0,1,2,3,4)
用in
@xiaobaiskill: in不是同时满足呀,条件为0.1.2.3.4时,这个字段就必须为0.1.2.3.4同时存在的,只有一个是不行的
@风轻殇: 怎么可能一个字段即使这个又是哪个,你把数据拿出来给我们看一下
@xiaobaiskill:
这是两张表的关联后的数据,现在是labelName = 9 and labelname = 108 时显示第一条,
当labelName = 9 and labelname = 23时显示第二条数据,类似很多种组合查找
@xiaobaiskill: 我不可能每出现一种情况就写一遍吧,帮忙啦,新手
@风轻殇: 感觉用法怪怪的,你那个sql 语句是怎么写的?
@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
@风轻殇: 你为什么不分几次查呢,写在一个sql 里面,极大的降低了你的查询效率,很蛋疼呀。你要的结果是什么?
@xiaobaiskill: 比如说十个数,我点击1和2能查到有1和2的数据,我点击1,2,3就能得到同时满足1,2,3的数据,有1的,有2的,有1,2的都不会出来,不知道说的是否够清楚
@风轻殇: 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: 试了,好用,十分感谢
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
字段=1 or字段=2 or字段=3
字段 in(1,2,3)
字段 =1
union
字段=2
union
字段=3
不是or的关系,一个字段同时满足多个关键字,
不对,比如说一个字段user_name它满足user_name = '1' and user_name = '2' and user_name = '3',
这样的,但是我的关键字有很多,我也不可能一个一个的写出来,所以有什么办法解决吗?
where f like '%1%' and f like '%2%' and f like '%3%'
如果说我有几十个,甚至更多呢?
@风轻殇: 用代码拼sql
@会长: 已经结贴了,问题解决,谢谢了
@风轻殇: 其实你这个设计违反了数据库第一范式,为什么不把那个label单独设计为一个表,这样是更常见的做法
@会长: 总共4张表,label,label_set,music_label,music_library,四张,
@风轻殇: 应该有一个表示多对多的关联方,而不是把所有label放到一个field里。
@会长: music_label就是那个多对多的张表进行关联的
@风轻殇: 数据库第一范式,了解一下
你是不是想说的是通过代码实现 sql 拼接。。。。。
已经拼接完了,现在是实现查询条件
@风轻殇: 你目前关注的问题是什么?
如果是查询字段或者条件太多,想在编码的时候偷个懒,写个方法动态组成语句。
如果是查询字段或者条件太多,考虑到编码质量等原因,可以考虑在软件设计、代码设计和实现上处理下。
@waiter: 不用了,已经结贴,谢谢