弄了一个表结构,突然不知道怎么进行数据查询,求助

水平凡 发布于 2017/09/19 09:28
阅读 441
收藏 1

bw_forms_field表结构

id name
1 姓名
2 内容简介

bw_forms_submit表结构

id title
1 这是一个submit
2 我就是个submit

bw_forms_data表结构

id submit_id field_id value
1 1 1 舞蹈者
2 1 2 这是一个内容啊~~很长很长的那种
3 2 1 舞蹈者
4 2 2 没有东西啊~~~

 

他们之间的关系,我想看表结构已经比较清楚了~~

现在有一个需求,想根据“姓名(1)”等于“舞蹈者”且,“内容简介(2)”包含“内容”这个词的submit筛选出来~~不重复。

突然不知道怎么写SQL了~~~有大神知道怎么解决不!

 

按照上面的意思,最终得到的应该是 submit_id = 1 的记录 符合  

“姓名(1)”等于“舞蹈者”且,“内容简介(2)”包含“内容”这个词

这个条件

 

 

加载中
0
陈善杰
陈善杰
SELECT 
    *
FROM
    bw_forms_data AS d
        LEFT JOIN
    bw_forms_submit AS s ON d.submit_id = s.id
        LEFT JOIN
    bw_forms_field AS f ON d.field_id = f.id
WHERE
    (d.`value` = '舞蹈者'
        AND f.`name` = '姓名')
        OR (d.`value` LIKE '%内容%'
        AND f.`name` = '内容简介')

 

水平凡
水平凡
可能是我意思不够明白,感觉你这个没办法达到我想要的~~我重新更新了下
0
老菜鸟0217
老菜鸟0217
SELECT
    d.submit_id FROM bw_forms_data d
WHERE d.field_id = ( SELECT f.id FROM bw_forms_field f WHERE f.name = '姓名' )
  AND d.value = '舞蹈者'

  AND d.submit_id in (
	SELECT
	d.submit_id FROM bw_forms_data d
WHERE d.field_id = ( SELECT f.id FROM bw_forms_field f WHERE f.name = '内容简介' )
  AND d.value like '%内容%'
);

-- 结果为1

 

其实我推荐另一种思路:进行两次简单可复用的sql查询,然后在你的php程序里对结果取交集。

SELECT
    d.submit_id FROM bw_forms_data d
WHERE d.field_id = ( SELECT f.id FROM bw_forms_field f WHERE f.name = '姓名' )
  AND d.value = '舞蹈者';

-- 上面结果为1、2

SELECT
	d.submit_id FROM bw_forms_data d
WHERE d.field_id = ( SELECT f.id FROM bw_forms_field f WHERE f.name = '内容简介' )
  AND d.value like '%内容%';

-- 上面结果为1

-- 取交集结果为1

PS:对于复杂逻辑,务必将操作置后到程序里面处理,不仅提升了sql的性能,也让sql易于维护。

有时候仅用一条大sql就查出结果并不是好事,看一个让我印象深刻的失败案例:

https://www.oschina.net/question/245286_2243708

水平凡
水平凡
数据量小还可以,大了,就不好办了。
0
乌龟壳
乌龟壳
select * from bw_forms_submit
where id in (
	select submit_id from (
		select f.id, d.submit_id
		from bw_forms_field f, bw_forms_data d
		where f.id = d.field_id
		  and (
				(f.name = '姓名'  and d.value = '舞蹈者')
			 or (f.name = ’内容简介' and d.value like '%内容%')
			)
		group by f.id, d.submit_id
	) a
	group by submit_id
	having count(1) = 2
)

 

返回顶部
顶部