SELECT DISTINCT没做我希望它会做的事情

时间:2012-10-19 18:08:38

标签: mysql sql

我想恢复一个属性列表。属性可以有很多“通行证”。我想带回一个唯一属性的列表,但如果它们有多个传递,我想要一个pass_id最大的那个。这就是我到目前为止所做的:

select * from passes
inner join properties on properties.prop_id = passes.prop_id
where pass_id NOT IN (select pass_id from queue where user_id = 1)

+---------+---------+---------+---------+------------------+--------------+-------+
| pass_id | prop_id | user_id | prop_id | full_street_name | house_number | zip   |
+---------+---------+---------+---------+------------------+--------------+-------+
|      18 |      21 |       1 |      21 |  N KEELER AVE    |         6200 | 60646 |
|      20 |      21 |       1 |      21 |  N KEELER AVE    |         6200 | 60646 |
|      21 |      21 |       1 |      21 |  N KEELER AVE    |         6200 | 60646 |
|      22 |      22 |       1 |      22 |  E CHESTNUT ST   |          111 | 60611 |
+---------+---------+---------+---------+------------------+--------------+-------+

我希望它只返回pass_id 21和22,因为18和20是21的重复属性。提前感谢。

3 个答案:

答案 0 :(得分:0)

因为您正在使用mysql,所以您可以使用这个仅限mysql的解决方案:

select * from (
    select * from passes
    inner join properties on properties.prop_id = passes.prop_id
    where pass_id NOT IN (select pass_id from queue where user_id = 1)
    order by pass_id desc) x
group by prop_id

此查询只是您的原始查询,但按pass_id desc排序,然后按prop_id进行分组。

在我知道的每个其他数据库中,这都会导致SQL语法异常,因为有些列没有被分组,而是没有聚合。但是,在mysql中,它不是给出错误,而是返回每个组的 first 行。在这种情况下,第一行是最大的pass_id,因为数据是按这种方式排序的。

答案 1 :(得分:0)

尝试:

 Select * From passes p
 Where Pass_Id =
     (Select Max(pass_Id) From Passes
      Where Prop_Id = p.Prop_Id)

答案 2 :(得分:0)

试试这个?

Select * From passes p  
Where Pass_Id in
  (Select [Max] = MAX(Pass_ID) OVER(PARTITION BY Prop_Id) 
   From Passes)