在同一个mysql查询中多次使用一个子查询结果

时间:2017-03-30 13:38:06

标签: mysql sql select join subquery

我们如何在同一个查询中多次使用一个子查询的结果集

SELECT
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) be ON joa.referred_by = be.id
) AS applicationcount,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) bf ON joa.referred_by = bf.id
    AND joa.admin_review = '3'
    AND joa.rejection_reason = 'Admin rejected your game'
) AS admin_reject,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) bg ON joa.referred_by = bg.id
    AND joa. STATUS = '5'
    AND joa.admin_review = '2'
) AS employer_reject,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) bd ON joa.referred_by = bd.id
    AND joa.admin_review = '1'
) AS admin_review,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) bc ON joa.referred_by = bc.id
    AND joa.admin_review = '5'
) AS accountmanager_review,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) ba ON joa.referred_by = ba.id
    AND joa.admin_review = '6'
) AS rp_review,
(
    SELECT
        COUNT(joa.id)
    FROM
        game_applied joa
    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
        JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = 1
    ) bh ON joa.referred_by = bh.id
    AND joa.admin_review = '2'
    AND (
        joa. STATUS = '' || joa. STATUS = 1 || joa. STATUS = 2 || joa.    STATUS = 3 || joa. STATUS = 4
    )
) AS other_status 
  FROM
game_applied ja
JOIN user_user u ON u.id = ja.applied_recruiter_id
INNER JOIN (
SELECT
    jrmm.id
FROM
    game_refer_to_member jrmm
    JOIN game_refer jrr ON jrr.id = jrmm.rid
AND jrr.referby_user_id = 2551
AND jrmm. STATUS = '1'
) bn ON ja.referred_by = bn.id
GROUP BY
applicationcount

我们如何在同一个查询中多次使用一个子查询的结果集

子查询在此查询中多次使用

(
SELECT
    jrmm.id
FROM
    game_refer_to_member jrmm
JOIN game_refer jrr ON jrr.id = jrmm.rid
AND jrr.referby_user_id = 2551
AND jrmm. STATUS = '1'
  ) bn ON ja.referred_by = bn.id

2 个答案:

答案 0 :(得分:2)

试试这个:

public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public static Type dummyt = typeof(SignaturePad.Forms.iOS.SignaturePadRenderer);
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {

答案 1 :(得分:1)

好的......我会尝试先弄清楚查询的作用。我将替换所有的实例:

SELECT
    COUNT(joa.id)
FROM
    game_applied joa
INNER JOIN (
    SELECT
        jrmm.id
    FROM
        game_refer_to_member jrmm
    JOIN game_refer jrr ON jrr.id = jrmm.rid
    AND jrr.referby_user_id = 2551
    AND jrmm. STATUS = '1'

用短语:

( SELECT count(*) FROM joa JOIN (subselect))

...为了清楚起见。

我也删除了GROUP BY,因为它无用和/或误导,除非你能解释它为什么存在。

我认为ja.applied_recruiter_id是外键,这意味着......

JOIN user_user u ON u.id = ja.applied_recruiter_id

...总是返回一行。由于实际上没有选择user_user中的列,因此可以删除此连接。现在,这部分:

    INNER JOIN (
        SELECT
            jrmm.id
        FROM
            game_refer_to_member jrmm
            JOIN game_refer jrr ON jrr.id = jrmm.rid
        AND jrr.referby_user_id = 2551
        AND jrmm. STATUS = '1'
    ) bn ON ja.referred_by = bn.id

......目前还不清楚这是做什么的。由于子选择与先前查询中的子选择相同,因此它不太可能过滤整个查询返回的行。我说它唯一的影响是无用的重复行,这就解释了为什么有一个GROUP BY ...所以,关闭它。

我们得到:

SELECT
( SELECT count(*) FROM joa JOIN (subselect)) be ON joa.referred_by = be.id ) AS applicationcount,
( SELECT count(*) FROM joa JOIN (subselect)) bf ON joa.referred_by = bf.id
    AND joa.admin_review = '3'
    AND joa.rejection_reason = 'Admin rejected your game'
) AS admin_reject,
( SELECT count(*) FROM joa JOIN (subselect)) bg ON joa.referred_by = bg.id
    AND joa. STATUS = '5'
    AND joa.admin_review = '2'
) AS employer_reject,
( SELECT count(*) FROM joa JOIN (subselect)) bd ON joa.referred_by = bd.id
    AND joa.admin_review = '1'
) AS admin_review,
( SELECT count(*) FROM joa JOIN (subselect)) bc ON joa.referred_by = bc.id
    AND joa.admin_review = '5'
) AS accountmanager_review,
( SELECT count(*) FROM joa JOIN (subselect)) ba ON joa.referred_by = ba.id
    AND joa.admin_review = '6'
) AS rp_review,
( SELECT count(*) FROM joa JOIN (subselect)) bh ON joa.referred_by = bh.id
    AND joa.admin_review = '2'
    AND (joa. STATUS = '' || joa. STATUS = 1 || joa. STATUS = 2 || joa.    STATUS = 3 || joa. STATUS = 4)
) AS other_status 
  FROM
game_applied ja

...而且,使用与Sarhash相同的逻辑,我们将其简化为:

SELECT COUNT(joa.id) AS applicationcount, 
     SUM(joa.admin_review = '3' AND joa.rejection_reason = 'Admin Rejected your resume') AS admin_reject, 
     SUM(joa.STATUS = '5' AND joa.admin_review = '2') AS employer_reject, 
     SUM(joa.admin_review = '1') AS admin_review, 
     SUM(joa.admin_review = '5') AS accountmanager_review, 
     SUM(joa.admin_review = '6') AS rp_review, 
     SUM(joa.admin_review = '2' AND joa.STATUS != '5') AS other_status, 
FROM game_refer_to_member jrmm 
INNER JOIN game_refer jrr ON jrr.id = jrmm.rid 
INNER JOIN game_applied joa ON jrmm.id  = joa.referred_by  
WHERE jrmm.STATUS = '1' AND jrr.referby_user_id = 2551

(这是相同的,减去对USER的无用连接和WHERE中的清理,谢谢Sarhash,你得到所有的功劳)。