想用普通 SQL
语句解决此类『某表有多列「多值属性」(可存为「数组」或「独立表」)。现给定过滤条件,找出包含所有这些条件的行记录』问题。如:
MySQL
、PHP
』『又购买过iPhone 13
、红米 K50
』的虎友粤语
、上海话
』『考试又过了英语专八
、日语 N1
』的学生注意:
MySQL
8.0.17+ 的多值索引。B+
树索引(好像PostgreSQL
有针对json
的高效索引)WHERE IN (Sub Query)
『既看过《明日战记》《独行月球》』『又看过《当尘埃落尽》《血清素》』
那不就是
看过《明日战记》、《独行月球》、《当尘埃落尽》和《血清素》
吗?
SELECT * FROM hu60_user WHERE
uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%电影A%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%电影B%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%电影C%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%电影D%');
实际试一下
SELECT uid, name FROM hu60_user WHERE
uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%mysql%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%php%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%iphone%13%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%红米%k50%');
完全正确
@无名啊,请考虑一下现实情况,MySQL
、PHP
、iPhone 13
和红米 K50
必然是用户输入的查询条件,这些条件肯定既不在程序里也不在表里,SQL语句必然是根据用户输入条件的个数动态生成的。
当用户输入三个查询条件(MySQL
、PHP
和iPhone 13
)的时候,SQL语句必然和四个查询条件(MySQL
、PHP
、iPhone 13
和红米 K50
)不同。
所以“不使用其他编程语言”有什么意义吗?
如果真的要死抠字眼,
SELECT uid, name FROM hu60_user WHERE
uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%mysql%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%php%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%iphone%13%')
AND uid IN (SELECT uid FROM hu60_bbs_topic_content WHERE content LIKE '%红米%k50%');
这使用其他编程语言了吗?并没有!它就是一个SQL语句,你怎么能说它使用了其他编程语言呢?它的查询条件固定了,我当然就不需要使用其他编程语言。但现实是查询条件的内容和数量都必然不固定。
目前只能做到想法子求出各条件的主键,再求它们的交集。也不知能不能直接合并成多个
where
条件之类的