繁体   English   中英

如何在 SQL 中选择具有 1 个以上不同值的行?

[英]How to select rows that have more than 1 distinct values in SQL?

我有4张桌子:

**[人]

ID_Person   Person_NAME**
    1   First name 1 Last name 1
    2   First name 2 Last name 2
    3   First name 3 Last name 3
    4   First name 4 Last name 4
    5   First name 5 Last name 5
    6   First name 6 Last name 6

**[mobile_number]
ID  Mobile_Number   OPERATOR**
1   797900010   M
2   797900011   M
3   698900010   I
4   797900012   I
5   698900011   J
6   797900013   T
7   797900011   J
8   698900012   I
9   797900014   L
10  698900013   M
11  797900015   M


**[user_mobile]
ID  ID_USER ID_MOBILE**
1   1   1
2   1   3
3   1   11
4   2   6
5   2   8
6   3   5
7   3   10
8   4   2
9   5   4
10  5   7
11  6   9

**[MESSAGE_ID]
ID_Message  ID_MOBILE   Message Date**
1   1   text 1          12/04/2011
2   1   text 2          07/07/2011
3   1   text 3          05/11/2011
4   2   text 4          01/13/2012
5   2   text 5          17/02/2012
6   2   text 6          13/12/2012
7   3   text 7          25/12/2011
8   4   text 8          11/11/2012
9   4   text 9          03/03/2012
10  5   text 10         30/04/2012
11  5   text 11         28/02/2012
12  6   text 12         01/06/2011
13  7   text 13         19/08/2010
14  8   text 14         22/12/2010
15  8   text 15         14/05/2010
16  9   text 16         09/04/2012
17  10  text 17         11/05/2011
18  11  text 18         15/01/2012

我必须选择所有在不同年份发送过短信的用户要显示的列:人名、手机号码、短信文本、年份

我的解决方案:

    Select a.Person_Name, Mobile_Nr, message, year(Date) as Years from PERSON a
    inner join USER_MOBILE b on a.ID_PERSON=b.ID_USER
    inner join MOBILE_NUMBER c on b.ID_MOBILE=C.ID
    inner join MESSAGE_ID d on c.ID=d.ID_Mobile
    group by Person_Name, Mobile_Nr,message,year(Date)
    having count(distinct year(date))>1

但它不会返回任何内容。 如果我将其更改为“ having count(distinct year(date))=1 ”我得到:

     **Person_Name  Mobile_Nr     message   Years**
Firstname 1 Lastname 1  698900010   text7   2011
Firstname 1 Lastname 1  797900010   text1   2011
Firstname 1 Lastname 1  797900010   text2   2011
Firstname 1 Lastname 1  797900010   text3   2011
Firstname 1 Lastname 1  797900015   text18  2012
Firstname 2 Lastname 2  698900012   text14  2010
Firstname 2 Lastname 2  698900012   text15  2010
Firstname 2 Lastname 2  797900013   text12  2011
Firstname 3 Lastname 3  698900011   text10  2012
Firstname 3 Lastname 3  698900011   text11  2012
Firstname 3 Lastname 3  698900013   text17  2011
Firstname 4 Lastname 4  797900011   text4   2012
Firstname 4 Lastname 4  797900011   text5   2012
Firstname 4 Lastname 4  797900011   text6   2012
Firstname 5 Lastname 5  698900009   text13  2010
Firstname 5 Lastname 5  797900012   text8   2012
Firstname 5 Lastname 5  797900012   text9   2012
Firstname 6 Lastname 6  797900014   text16  2012

但这是错误的,我只想显示不同年份发送短信的用户。

尝试这样的事情:

Select a.Person_Name, Mobile_Nr, message, year(D.Date) as Years from PERSON a
    inner join USER_MOBILE b on a.ID_PERSON=b.ID_USER
    inner join MOBILE_NUMBER c on b.ID_MOBILE=C.ID
    inner join MESSAGE_ID d on c.ID=d.ID_Mobile
WHERE 

EXISTS(

    SELECT 1 
    FROM 
       PERSON a1
       INNER JOIN USER_MOBILE b1 on a1.ID_PERSON=b1.ID_USER
       inner join MOBILE_NUMBER c1 on b1.ID_MOBILE=C1.ID
       inner join MESSAGE_ID d1 on c1.ID=d1.ID_Mobile
    WHERE 
       C1.MOBILE_NUMBER = C.MOBILE_NUMBER AND 
       year(D1.Date)<>year(D.DATE) 

)

我知道它可以简化很多,但我只是想在这里演示这个概念

试试这个——同样的基本查询,加上一个 WHERE-clause 子查询,它过滤掉多年没有电话的人。

--  Person, phone number, message, and year, for persons who had messages in multiple years
Select a.Person_Name, Mobile_Nr, message, year(Date) as Years
 from PERSON a
 inner join USER_MOBILE b on a.ID_PERSON=b.ID_USER
 inner join MOBILE_NUMBER c on b.ID_MOBILE=C.ID
 inner join MESSAGE_ID d on c.ID=d.ID_Mobile
 where a.ID_PERSON in (select a.ID_PERSON
                        from PERSON a
                         inner join USER_MOBILE b on a.ID_PERSON=b.ID_USER
                         inner join MOBILE_NUMBER c on b.ID_MOBILE=C.ID
                         inner join MESSAGE_ID d on c.ID=d.ID_Mobile
                        group by a.ID_PERSON
                        having count(distinct year(d.date)) > 1)

(我无法检查语法,但这个概念是合理的)

您的解决方案非常接近。 问题是您按year(date)聚合,因此任何给定行中只能出现一年。 尝试这个:

   Select a.Person_Name, Mobile_Nr, message,
          count(distinct year(Date)) as Years
   from PERSON a inner join
        USER_MOBILE b
        on a.ID_PERSON = b.ID_USER inner join
        MOBILE_NUMBER c
        on b.ID_MOBILE = C.ID inner join
        MESSAGE_ID d
        on c.ID = d.ID_Mobile
    group by Person_Name, Mobile_Nr, message
    having count(distinct year(date)) > 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM