首页 新闻 会员 周边

求此表的sql写法

0
悬赏园豆:50 [已解决问题] 解决于 2011-12-29 15:09

我有三张表,比如手机表,手机参数表,手机表_参数表(中间表)

如图:phone(手机表)

tese(参数表)

phone_tese(手机_参数表)

我现在要查询符合以下条件的手机:

如 cpu为800MHz,并且上市时间为2010年,并且手机频段有1800的手机数据。请问如何查询?

问题补充:

再补充一句,是用的sql2000的服务器

未来的猩猩的主页 未来的猩猩 | 初学一级 | 园豆:92
提问于:2011-12-27 09:44
< >
分享
最佳答案
0

这是我的SQL查询语句,不知道能否满足的你需求。

select * from phone where PhoneId in
(select PnoneId from phone_tese
where TestId in
(select TestId form tese
where TeseName='CPU' or TeseName='手机频段' or TeseName='上市时间'
)
and phonevalue in ('800MHz','2010年') or phonevalue like '1800'
group by PnoneId
having count(PnoneId)=3
)
收获园豆:50
休闲加油站 | 菜鸟二级 |园豆:330 | 2011-12-29 11:42

正解!!!!

未来的猩猩 | 园豆:92 (初学一级) | 2011-12-29 15:08

谢谢!

未来的猩猩 | 园豆:92 (初学一级) | 2011-12-29 15:08

@未来的猩猩: 呵呵,不客气

休闲加油站 | 园豆:330 (菜鸟二级) | 2012-01-09 12:47
其他回答(6)
0

没有日期字段你怎么查上市时间为2010年的

樂乐樂 | 园豆:205 (菜鸟二级) | 2011-12-27 09:50

不是,你看到没,我第二个表中有个参数名叫做上市时间,而第三个表里有个id引用(19)的phonevalue为2010年。这就是他们的关系

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 09:56
-1

select phoneName , imgUrl from phone as p , test as te where (p.phoneId in (select t.phoneid from phone_test as t where phonevalue='800MHz' and phonevalue='2010年' and phonevalue in ('1800'))) and   (te.testId in (select t.phoneid from phone_test as t where phonevalue='800MHz' and phonevalue='2010年' and phonevalue in ('1800')))

悟行 | 园豆:12559 (专家六级) | 2011-12-27 10:02

不行,写法有问题。

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 12:09
0

select * from tese inner join phone_tese on tese.teseid=phone_tese.teseid inner join phone on phone.phoneid=phone_tese where tese.tesename='cpu' and phone_tese.phonevalue like '%%' and phonevalue like '%2010%' and phonevalue like '%800%'

画方软件 | 园豆:778 (小虾三级) | 2011-12-27 10:26

你这种写法就只是筛选出cpu的条件

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 12:09

@未来的猩猩: 你要的是什么,你再根据条件修改下不就ok了;很简单的东西;变通下就ok了;还没有明白;

支持(0) 反对(0) 画方软件 | 园豆:778 (小虾三级) | 2011-12-27 12:58

@HuaFang: 我现在就是要筛选出符合各个条件的手机!照你这思维根本没法实现!

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 14:23
0

把这三个表创建一个视图,然后拿条件过滤一下就可以了

sunlary | 园豆:934 (小虾三级) | 2011-12-27 10:50
0
SELECT     
*
FROM phone
WHERE
phoneid IN (
SELECT
pt.Phoneid
FROM phone_tese pt
WHERE
pt.teseid=16
AND pt.phonevalue='800MHz'
INTERSECT
SELECT
pt.Phoneid
FROM phone_tese pt
WHERE
pt.teseid=19
AND pt.phonevalue='2010年'
INTERSECT
SELECT
pt.Phoneid
FROM phone_tese pt
WHERE
pt.teseid=20
AND pt.phonevalue LIKE '%1800%' )

 

在Phone_Tese把你需要的条件都添加进去
,然后求交集,这样就可以把所有符合条件的Phone的ID找出来。然后再去
Phone表,以及其他的表中查询相关的数据信息。

不过建议你写成存储过程,或者视图的形式,这样比较的方便。

胥健 | 园豆:151 (初学一级) | 2011-12-27 10:58

sql2000不支持INTERSECT   语法

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 11:19

@未来的猩猩: 那就改成UNION

支持(0) 反对(0) 胥健 | 园豆:151 (初学一级) | 2011-12-27 13:19

@胥健: 那就不是取交集了。是取并集,只是去除了重复的了而已。

支持(0) 反对(0) 未来的猩猩 | 园豆:92 (初学一级) | 2011-12-27 14:19
1

SELECT B.*
FROM phone_tese A
  JOIN phone B
  ON A.PhoneID = B.PhoneID
  JOIN tese C
  ON A.teseID = C.TeseID
WHERE CASE WHEN teseName = 'CPU' THEN PhoneValue ELSE '' END = '800MHz'
  AND CASE WHEN teseName = '上市时间' THEN PhoneValue ELSE '' END = '2010年'  
  AND CASE WHEN teseName = '手机频段' THEN PhoneValue ELSE '' END LIKE '%1800%'

 

晕.可能看错..稍等一下.给你新的.

圈圈点点 | 园豆:212 (菜鸟二级) | 2011-12-27 16:59

吃饭去了.新的如下,给分吧.:)

SELECT *
FROM phone
WHERE PhoneID IN
  (SELECT A.PhoneID
  FROM phone_tese A
    JOIN tese C
    ON A.teseID = C.TeseID
  WHERE PhoneValue LIKE CASE teseName WHEN 'CPU' THEN '800MHz' WHEN '上市时间' THEN '2010年' WHEN '手机频段' THEN '%1800%' END
  GROUP BY A.PhoneID
  HAVING COUNT(PhoneID) >= 3
  )

支持(0) 反对(0) 圈圈点点 | 园豆:212 (菜鸟二级) | 2011-12-27 18:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册