我有三张表,比如手机表,手机参数表,手机表_参数表(中间表)
如图:phone(手机表)
tese(参数表)
phone_tese(手机_参数表)
我现在要查询符合以下条件的手机:
如 cpu为800MHz,并且上市时间为2010年,并且手机频段有1800的手机数据。请问如何查询?
再补充一句,是用的sql2000的服务器
这是我的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
)
正解!!!!
谢谢!
@未来的猩猩: 呵呵,不客气
没有日期字段你怎么查上市时间为2010年的
不是,你看到没,我第二个表中有个参数名叫做上市时间,而第三个表里有个id引用(19)的phonevalue为2010年。这就是他们的关系
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')))
不行,写法有问题。
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%'
你这种写法就只是筛选出cpu的条件
@未来的猩猩: 你要的是什么,你再根据条件修改下不就ok了;很简单的东西;变通下就ok了;还没有明白;
@HuaFang: 我现在就是要筛选出符合各个条件的手机!照你这思维根本没法实现!
把这三个表创建一个视图,然后拿条件过滤一下就可以了
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表,以及其他的表中查询相关的数据信息。
不过建议你写成存储过程,或者视图的形式,这样比较的方便。
sql2000不支持INTERSECT 语法
@未来的猩猩: 那就改成UNION
@胥健: 那就不是取交集了。是取并集,只是去除了重复的了而已。
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%'
晕.可能看错..稍等一下.给你新的.
吃饭去了.新的如下,给分吧.:)
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
)