0

次の5つのテーブルがあります。

 company        type    branch      company_type       company_branch
 -------        ----    ------     -------------       --------------
  c_id          t_id     b_id       c_id | t_id         c_id | b_id     
  ----          ---      ----       -----------        --------------
   1             1        1            1  1              1     1
   2             2        2            1  2              1     2
                 3        3            2  1              2     1
                                       2  3              2     3

次の 2 つのクエリは正常に機能します。

SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_type` t ON `t`.`c_id` = `co`.`c_id`
WHERE `co`.`status` = 1
GROUP BY `co`.`c_id`
HAVING sum(if(`t`.`t_id` in (1,2),1,0)) = 2       (---> returns 1 ) Correct !

SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_branch` b ON `b`.`c_id` = `co`.`id`
WHERE `co`.`status` = 1
GROUP BY `co`.`id`
HAVING sum(if(`b`.`b_id` in (1,2),1,0)) = 2        (---> returns 1 ) Correct !

しかし、次のようにそれらを結合しようとすると、空の結果が得られます。

SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_branch` b ON `b`.`c_id` = `co`.`id`
JOIN `company_type` t ON `t`.`c_id` = `co`.`id`
WHERE `co`.`status` = 1
GROUP BY `co`.`id`
HAVING sum(if(`b`.`b_id` in (1,2),1,0)) = 2 AND sum(if(`t`.`t_id` in (1,2),1,0)) = 2

私の推測では、2 つの条件の間の AND が原因です。誰かが手がかりを持っていますか?? または回避策?

期待される結果: 1

4

3 に答える 3

2

おそらく、不注意なデカルト結合を取得しているため、4つのレコードが生成されます。ブランチとタイプごとに2つ。私の推測では、あなたのカウントはそれぞれ4つです...確かに、試してみてください

SELECT `co`.`c_id`,
       sum(if(`b`.`b_id` in (1,2),1,0)) as BranchCount,
       sum(if(`t`.`t_id` in (1,2),1,0)) as TypeCount
   FROM (`company` co)
      JOIN `company_branch` b ON `b`.`c_id` = `co`.`id`
      JOIN `company_type` t ON `t`.`c_id` = `co`.`id`
   WHERE `co`.`status` = 1
   GROUP BY `co`.`id`

それを修正するには、次のように調整します。

select co.C_ID
   from
      company co
         join company_branch b 
            on co.id = b.c_id
           and b.b_id in ( 1, 2 )
         join company_type t 
            on co.id  = t.c_id
           and t.t_id in ( 1, 2 )
   where
      co.status = 1
   GROUP BY 
      co.id
   HAVING
           count( distinct b.b_id ) = 2
       AND count( distinct t.t_id ) = 2
于 2012-04-17T15:45:06.983 に答える
0

ところで、あなたが投稿したクエリにはいくつかのエラーがあるので、誰かがそれを試してみたい場合にそれを実行できるように、正しいものを投稿しようとしています。1つ目:SELECTDISTINCT coc_id FROM(companyco)company_typeJOINtON tc_id= coc_id GROUPBY coc_id HAVING sum(if( 。in(1,2) tt_id1,0))= 2 2番目のもの:

SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_branch` b ON `b`.`c_id` = `co`.`c_id`
GROUP BY `co`.`c_id`
HAVING sum(if(`b`.`b_id` in (1,2),1,0)) = 2

テーブル構造でステータス列を取得しなかったため、ステータス列を除外しました。

今、私はあなたのビジネスロジックが何であるかわかりませんが、私はあなたの最終的なSQLを次のように立てています:

SELECT DISTINCT `co`.`c_id`,sum(if(`cb`.`b_id` in (1,2),1,0)) cb_sum,sum(if(`ct`.`t_id` in (1,2),1,0)) ct_sum
FROM (`company` co)
LEFT JOIN `company_branch` cb ON `cb`.`b_id` = `co`.`c_id`
LEFT JOIN `company_type` ct ON `ct`.`t_id` = `co`.`c_id`
GROUP BY `co`.`c_id`
HAVING sum(if(`cb`.`b_id` in (1,2),1,0)) = 2 AND sum(if(`ct`.`t_id` in (1,2),1,0)) = 2

ここで、HAVING句なしでSQLを実行すると、次のような出力が表示されます。

c_id      cb_sum       ct_sum
1         4            4
2         1            1

したがって、条件を「=2」ではなく「>2」に変更すると、必要なものが得られるはずですが、他のオプションは、UNIONを使用して結果セットを次のように結合することです。

SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_type` t ON `t`.`c_id` = `co`.`c_id`
GROUP BY `co`.`c_id`
HAVING sum(if(`t`.`t_id` in (1,2),1,0)) = 2
UNION
SELECT DISTINCT `co`.`c_id`
FROM (`company` co)
JOIN `company_branch` b ON `b`.`c_id` = `co`.`c_id`
GROUP BY `co`.`c_id`
HAVING sum(if(`b`.`b_id` in (1,2),1,0)) = 2
于 2012-04-17T15:57:12.480 に答える
0

このクエリは要件を満たす必要があります。HAVING 句でフィルタ条件を指定する代わりに、最初に各 co_id の合計を計算し、サブクエリを使用して WHERE 句のフィルタ条件をそれらに適用します。これはうまくいくはずです。

SELECT Z.* FROM
(
SELECT `co`.`c_id`,
       sum(if(`b`.`b_id` in (1,2),1,0)) as BranchCount,
       sum(if(`t`.`t_id` in (1,2),1,0)) as TypeCount
   FROM (`company` co)
      JOIN `company_branch` b ON `b`.`c_id` = `co`.`id`
      JOIN `company_type` t ON `t`.`c_id` = `co`.`id`
   WHERE `co`.`status` = 1
   GROUP BY `co`.`id`
) Z
WHERE Z.BranchCount=2 AND Z.TypeCount=2;
于 2012-04-17T15:51:14.857 に答える