【问题标题】:Select in Select MySQL在选择 MySQL 中选择
【发布时间】:2013-05-31 18:22:37
【问题描述】:

我有两个查询,我想是否可以仅在一个查询中作为 Select 中的 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 = '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 列表(按年龄、国家或注册日期过滤)

第二个:

SELECT count(`matches`.`id`) FROM `matches` WHERE (`matches`.`status_home` = 3 AND `matches`.`status_guest` = 3) AND (`matches`.`team_home` = 13 OR `matches`.`team_guest` = 13)

我需要为检索到的每个 ID 执行第二次选择。 对于每次执行,我必须将值 13 替换为检索到的 id。

可以在一个查询中执行所有操作吗?

提前感谢您的帮助

【问题讨论】:

    标签: mysql multi-select


    【解决方案1】:

    试试这个 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
    

    【讨论】:

    • 有一个问题,您建议使用 INNER JOIN,但 ON 子句是错误的 :( t.id 值可能位于 team_home 字段或 team_guest 字段上,我还必须使用参数更改 team_home = 13价值
    【解决方案2】:

    您可以将您想要做的事情表达为显式连接。但是问题要求在选择中进行选择。为此,您需要一个相关的子查询。这是最终的查询:

    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,所以在没有相关子查询的情况下执行此操作有点挑战性。

    【讨论】:

      猜你喜欢
      • 2012-09-12
      • 2021-09-14
      • 2011-06-02
      • 2018-10-16
      • 2021-11-19
      • 1970-01-01
      • 2013-01-03
      • 2019-05-29
      • 1970-01-01
      相关资源
      最近更新 更多