MySQL:仅从查询数据集中获取条件行

时间:2014-01-16 06:06:27

标签: mysql sql optimization

请更新标题,因为我没有任何合适的标题并删除此评论;)

我有一个包含以下数据的表:

ID assigned_to foreign_id PURCHASE_DATE
1 5 1 2014年1月1日
4 7 1 2014年1月9日
6 2 1 2014-01-10
8 9 1 2014年1月13日
12 9 2 2014年1月13日
18 9 3 2014年1月13日

如果`assigned_to = 7,

存在行,我想从foreign_id=1assigned_to=7的此数据中检索行

其他行为purchase_date 的最新foreign_id=1,不论assign_to = 7 ;

结果集:

ID assigned_to foreign_id PURCHASE_DATE

案例I:IF ASSIGNED_TO = 7 AND FOREIGN_ID = 1
4 7 1 2014年1月9日 -------------------------------------------------- ------------------------------

案例2:IF ASSIGNED_TO = 7 AND FOREIGN_ID = 2
12 9 2 2014年1月13日


请提供MySQL查询以获取要求。无论我的想法是什么,或者我的SQL知识;)我得到的行只有assigned_to = 7,或者如果assigned_to = X [x =其他已分配的用户和其他其他foreign_ids]则不存在于表中。

4 个答案:

答案 0 :(得分:1)

你可以使用case ...在mysql中使用count()函数。

查看以下链接: http://www.mysqltutorial.org/mysql-case-statement/

答案 1 :(得分:1)

您可以使用下面的简单IF ELSE

IF(EXISTS(SELECT * FROM test where assigned_to = 7 AND foreign_id=1))
BEGIN 
  SELECT * FROM test
  WHERE foreign_id=1 AND assigned_to = 7
END
ELSE
  SELECT * FROM test WHERE foreign_id=1 AND purchase_date = (select MAX(purchase_date) from test)

答案 2 :(得分:1)

foreign_id上的过滤器放入WHERE子句,将assigned_to上的过滤器放入ORDER BY子句,并添加LIMIT 1,如下所示:

SELECT
  id,
  assigned_to,
  foreign_id,
  purchase_date
FROM
  atable
WHERE
  foreign_id = @foreign_id
ORDER BY
  assigned_to = @assigned_to DESC,
  purchase_date              DESC
LIMIT 1
;

其中@foreign_id@assigned_to是查询参数。

查询将首先找到与@foreign_id匹配的所有行。然后它将它们分成两个子集:

1)与@assigned_to匹配的行;
2)所有其他人。

@assigned_to子集将放在另一个子集之前,并且两者将按purchase_date的降序进行额外排序。最后,将返回已排序数据集的第一行,其余部分将被丢弃。

因此,查询会返回最新的@foreign_id / @assigned_to匹配(如果存在),或者仅返回最新的@foreign_id匹配。

答案 3 :(得分:0)

您好Aakash尝试此查询...

select * from (
select * from tbl_purchase where foreign_id=1 AND assigned_to = 7 
union
(select * from tbl_purchase where foreign_id=1 order by purchase_date desc limit 1)
) as t limit 1