MySQL在一个查询中有多个SELECT语句

时间:2016-08-25 10:24:22

标签: mysql

我将一些信息存储在MySQL表中,包括没有时间的日期。 日期格式是一个如下所示的字符串:“25.08.2016”(Day.Month.Year)。

我想从一个以列为单位的表中选择前50个记录,但我只想显示具有特定列条目(日期)的行。

这是一个排名系统,我想更新不活跃的人。

我需要结合这3个查询:

SELECT * FROM `rank` ORDER BY `rank`.`Score` DESC LIMIT 0 , 50;
SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y'));
UPDATE `rank` SET `inactive` = '1';
  1. 选出前50名。
  2. 选择第一个查询的非活动人员。
  3. 将人员更新为无效。
  4. 最多Score是排名1,这就是我需要DESC的原因,我只想将前50名人员标记为无效,低于50这些人无关紧要,这就是为什么我不能使用像这样:

    SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')) ORDER BY `rank`.`Score` DESC LIMIT 0 , 50
    

    是的,它会选择50行而不是前50行。

    BTW我在php中这样做。 我可以通过获取来解决问题:

    SELECT * FROM `rank` ORDER BY `rank`.`Score` DESC LIMIT 0 , 50;
    

    然后将Accound ID存储到数组中,然后查询:

    SELECT * FROM `rank` WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y')) ORDER BY `rank`.`Score` DESC LIMIT 0 , 50;
    

    将Accound ID与其他结果进行比较,如果没有找到匹配,我就打破循环。

    我不能只用纯MySQL吗?我不能查询一个东西然后过滤结果吗?

    请帮助我,还有其他问题吗?

3 个答案:

答案 0 :(得分:1)

顺序执行查询的一种方法是使用事务。 但是,这不会将您的查询合并为一个。

BEGIN TRANSACTION;

SELECT * 
FROM `rank` 
ORDER BY `rank`.`Score` DESC LIMIT 0 , 50;

SELECT * 
FROM `rank` 
WHERE NOT (`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR `TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y'));

UPDATE `rank` SET `inactive` = '1';


COMMIT;

答案 1 :(得分:1)

也许这可能是三个查询的组合:

update rank r
set r.inactive = 1
from
(select a.account_id from rank a
join (select account_id from rank order by rank.score desc limit 0, 50) b on (a.account_id = b.account_id )
where (a.`TimeStamp1` = DATE_FORMAT(NOW(), '%d.%m.%Y') OR a.`TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY), '%d.%m.%Y'))) l
where r.account_id = l.account_id 

让我知道是否有任何失败:)

编辑:使用account_id交换rank_id

答案 2 :(得分:1)

这是我的答案。

UPDATE rank AS target
INNER JOIN (
    SELECT w.id
    FROM rank AS w
    INNER JOIN rank AS e ON e.id = w.id
    WHERE (w.`TimeStamp1` = DATE_FORMAT(NOW(), '%Y-%m-%d') OR w.`TimeStamp1` = DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 DAY),'%Y-%m-%d')) 
    ORDER BY w.`Score` DESC
    LIMIT 50
) AS source ON source.id = target.id
SET inactive = 1;