2

私は 2 つのクエリを持っています。可能であれば、Select in Select として 1 つのクエリだけで実行したいと思います。

最初の1つ:

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のリストを取得します(年齢、国、または登録日でフィルタリングされます)

2番目のもの:

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 によって取得されたすべての ID に対して 2 番目の選択を実行する必要があります。実行するたびに、値 13 を取得した ID に置き換える必要があります。

select in select を使用して単一のクエリですべてを実行することは可能ですか?

ご協力ありがとうございます

4

2 に答える 2

0

やりたいことを明示的な結合として表現できます。しかし、質問は選択内の選択を求めています。そのためには、相関サブクエリが必要です。最後のクエリは次のとおりです。

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相関サブクエリを使用せずにこれを行うのは、 が一致する条件であるため、少し困難です。

于 2013-05-31T22:14:47.770 に答える
0

この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
于 2013-05-31T18:28:19.840 に答える