在选择MySQL中选择

在选择MySQL中选择,mysql,multi-select,Mysql,Multi Select,我有两个查询,如果可能,我希望在一个查询中执行,作为选择 第一个: SELECT users.id FROM users LEFT JOIN users_date ON users_date.user = users.id LEFT JOIN users_varchar ON users_varchar.user = users.id WHERE abilitato = 1 AND users_date.key = 'birthday' AND users_varchar.key = 'nat

我有两个查询,如果可能,我希望在一个查询中执行,作为选择

第一个:

SELECT
users.id
FROM users
LEFT JOIN users_date ON users_date.user = users.id
LEFT JOIN users_varchar ON users_varchar.user = users.id
WHERE
abilitato = 1 
AND users_date.key = 'birthday'
AND users_varchar.key = 'nation'
AND users_varchar.value = 'US'
AND (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31')
AND (floor(DATEDIFF(NOW(), users_date.value) / 365) >= 19 AND floor(DATEDIFF(NOW(), users_date.value) / 365) <= 19)
我需要对用户检索到的每个ID执行第二次选择。 对于每个执行,我必须用检索到的id替换值13

可以使用select in select?在单个查询中执行所有操作

感谢您的帮助

尝试使用此sql

SELECT count(`matches`.`id`) 
FROM `matches` m
INNER JOIN ( SELECT users.id as id
FROM users
LEFT JOIN users_date ON users_date.user = users.id
LEFT JOIN users_varchar ON users_varchar.user = users.id
WHERE abilitato = 1 
AND users_date.key = 'birthday'
AND users_varchar.key = 'nation'
AND users_varchar.value = 'US'
AND (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31')
AND (floor(DATEDIFF(NOW(), users_date.value) / 365) >= 19 AND floor(DATEDIFF(NOW(), users_date.value) / 365) <= 19)) t
on t.id=m.team_guest
WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) 
AND (`matches`.`team_home` = 13 OR `matches`.`team_guest` = t.id)
GROUP BY t.id

可以将要执行的操作表示为显式联接。但该问题要求在select中选择一个select。为此,您需要一个相关子查询。最后一个问题是:

select users.id,
       (SELECT count(`matches`.`id`)
        FROM `matches`
        WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) AND 
              (`matches`.`team_home` = user.id OR `matches`.`team_guest` = users.id)
       ) as cnt
FROM users LEFT JOIN
     users_date
     ON users_date.user = users.id LEFT JOIN
     users_varchar
     ON users_varchar.user = users.id
WHERE abilitato = 1 AND users_date.key = 'birthday' AND
      users_varchar.key = 'nation' AND users_varchar.value = 'US' AND
      (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31') AND
      (floor(DATEDIFF(NOW(), users_date.value) / 365) >= 19 AND
       floor(DATEDIFF(NOW(), users_date.value) / 365) <= 19
      )
格式设置帮助我更好地理解查询


在没有相关子查询的情况下执行此操作有点困难,因为匹配条件中存在or。

建议使用内部联接有一个问题,但ON子句是错误的:t.id值可能位于team_home字段或team_guest字段,我还必须使用参数值更改team_home=13
select users.id,
       (SELECT count(`matches`.`id`)
        FROM `matches`
        WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) AND 
              (`matches`.`team_home` = user.id OR `matches`.`team_guest` = users.id)
       ) as cnt
FROM users LEFT JOIN
     users_date
     ON users_date.user = users.id LEFT JOIN
     users_varchar
     ON users_varchar.user = users.id
WHERE abilitato = 1 AND users_date.key = 'birthday' AND
      users_varchar.key = 'nation' AND users_varchar.value = 'US' AND
      (users.reg_date >= '2013-05-31' AND users.reg_date <= '2013-05-31') AND
      (floor(DATEDIFF(NOW(), users_date.value) / 365) >= 19 AND
       floor(DATEDIFF(NOW(), users_date.value) / 365) <= 19
      )