2

私は2つのテーブルを持っています。以下を参照してください-プロファイルは私のメイン/マスターテーブルです

  profiles            invoices
 ____________       ___________________
|id  Name    |     |profileid   paid   |
|============|     |===================|
|1  Abraham  |     |  2         unpaid |
|2  Martin   |     |  3         unpaid |
|3  John     |     |  3         paid   |
|____________|     |___________________|

ご覧のとおり、abraham には 0 件の請求書があり、martin には 1 件の未払いの請求書があり、john には 2 件の請求書があります。1 有料、1 未払い。

検索したい:

  1. 請求書が支払われたすべてのプロファイル (john)
  2. 未払いの請求書があるすべてのプロファイル (ジョン & マーティン)
  3. 支払い済みと未払いの両方の請求書を持つすべてのプロファイル (ジョン)

1 と 2 は問題なく実行できますが、ステップ 3 に問題があります。

これが1のクエリです。

$query = "SELECT DISTINCT profiles.name 
FROM profiles LEFT JOIN invoices ON (profiles.id=invoices.profileid) 
AND (invoices.paid='paid' OR invoices.paid='unpaid')
WHERE
IFNULL(invoices.paid, '') LIKE 'paid';

これが2に対する私のクエリです。

$query = "SELECT DISTINCT profiles.name 
FROM profiles LEFT JOIN invoices ON (profiles.id=invoices.profileid) 
AND (invoices.paid='paid' OR invoices.paid='unpaid')
WHERE
IFNULL(invoices.paid, '') LIKE 'unpaid';

これが3に対する私のクエリです。

$query = "SELECT DISTINCT profiles.name 
FROM profiles LEFT JOIN invoices ON (profiles.id=invoices.profileid) 
AND (invoices.paid='paid' OR invoices.paid='unpaid')
WHERE
IFNULL(invoices.paid, '') LIKE 'paid' 
AND IFNULL(invoices.paid, '') LIKE 'unpaid'
;

前述のように、1 と 2 は問題なく動作しますが、3 では 0 の結果が得られます。どんな助けでも大歓迎です。ありがとう

4

3 に答える 3

2

invoices誰かが支払い済みと未払いの両方がある場所を取得するには、テーブルを 2 回選択する必要があります。次のようなものを試してください -

SELECT DISTINCT profiles.name 
FROM profiles 
LEFT JOIN invoices i1 ON (profiles.id=i1.profileid) 
AND (i1.paid='paid')
LEFT JOIN invoices i2 ON (profiles.id=i2.profileid) 
AND (i2.paid='unpaid')
WHERE
IFNULL(i1.paid, '') LIKE 'paid' 
AND IFNULL(i2.paid, '') LIKE 'unpaid';

この sqlfiddle の例を参照してください - http://sqlfiddle.com/#!2/ee4e2/4

于 2013-06-04T22:33:25.280 に答える
0

1 つの可能性は、プロファイルに関連付けられた個別の請求書の種類をカウントするサブクエリです。

SELECT `profiles`.`name`
FROM `profiles`
WHERE (
  SELECT count( DISTINCT `subinvoices`.`paid` )
  FROM `invoices` AS `subinvoices`
  WHERE `profiles`.`id` = `subinvoices`.`profileid`
    AND (`subinvoices`.`paid` = 'paid' OR `subinvoices`.`paid` = 'unpaid')
) = 2
于 2013-06-04T22:41:26.073 に答える
0

これを行う最も簡単な方法は、集計を使用することです。

select p.*, coalesce(InvoiceInfo, 'NONE')
from profiles p left outer join
     (select profileid,
             (case when sum(paid = 'PAID') > 0 and sum(paid = 'UNPAID') > 0 then 'BOTH'
                   when sum(paid = 'PAID') > 0 then 'PAID-ONLY'
                   when sum(paid = 'UNPAID') > 0 then 'UNPAID-ONLY'
              end) as InvoiceInfo
      from invoices i
     )
     on p.id = i.profileid

これにより、3 種類の情報すべてを一度に取得できます。たとえば、次のようにして、各グループの人数を数えることができます。

select coalesce(InvoiceInfo, 'NONE'), count(*)
from profiles p left outer join
     (select profileid,
             (case when sum(paid = 'PAID') > 0 and sum(paid = 'UNPAID') > 0 then 'BOTH'
                   when sum(paid = 'PAID') > 0 then 'PAID-ONLY'
                   when sum(paid = 'UNPAID') > 0 then 'UNPAID-ONLY'
              end) as InvoiceInfo
      from invoices i
     )
     on p.id = i.profileid
group by coalesce(InvoiceInfo, 'NONE')
于 2013-06-04T23:38:58.057 に答える