2011-10-28 35 views
1

更新:一番下に追加されたスキーマ...MySQLのクエリ、いくつかの正規化された表、問題ワット(PHP)から正規化されたテーブル行からカウント/

私が契約のテーブルがあります。tbl_contract

契約に関連付けられているユーザーの表:tbl_contract2user

はカラムと共に既存のエントリは、関係が存在することを意味するtbl_contract2userのエントリの任意の数、(存​​在し得ますおよび0 = approved)。

私の目標はです。指定された時間枠内に1人(またはそれ以上)のアクティブユーザーがいるすべての契約を選択します(下記参照)。

私が抱えている問題は、これらの契約を適切に並べ替えることができることです。日付範囲が正常に動作しています...何らかの理由で、ユーザー数が1以上の場合に問題が発生しました...(vs。0)とはい - そのデータセットを使用して作業します(クエリ)。

は...クエリの開始については、以下を参照してください

$result = mysql_query("SELECT tbl_contract.id 
    FROM  tbl_contract 
    LEFT JOIN tbl_contract2user ON tbl_contract.id = tbl_contract2user.contractID 
    WHERE  tbl_contract2user.pending = 0 
    AND   tbl_contract.startDate <= {$billing['start_time']} 
    AND   tbl_contract.endDate >= {$billing['end_time']}"); 

スキーマ:

tbl_contract:id, startDate, endDate, value, name, dateCreated

tbl_contract2user:id, contractID, userID, pending

+0

テーブルスキーマ( 'CREATE TABLE'ステートメントとして)、サンプルデータ(' INSERT'ステートメントとして)、サンプルデータの望ましい結果を含めてください。 mysql拡張機能は古くなっており、廃止予定です。代わりに、mysqliまたはPDOとプリペアドステートメントを使用してください。 – outis

+0

@outisこれは本当にシンプルなテーブルです。私は上記のスキーマを奨励しました(作成/挿入ステートメントとしてではなく、申し訳ありません - 私はそれについて少し不安です)。また、私はPHPのmysqlステートメントが減価償却されることを知らなかった - それはなぜですか?これは償却されても機能しなくなるということですか? – Shackrock

+0

1人以上のアクティブユーザーが何を意味するのかを明確にしてください。あなたのスキーマによれば、それを示すフラグはありません。アクティブな契約を意味しますか? –

答えて

2

実際の問題とは何ですか? 関連ユーザーのみのレコードではなく、すべてのレコードを取得しますか?そうならば、内部結合に登録しようと関係なく、すべての契約がなくなっている...

LEFTをオンに本当の問題は、私は1つの契約で6人のユーザーがいる場合は、私は が代わりに返された6行を取得することですその契約のための1行

これはまさにJOINの機能です。特定の条件を使用して、左側からすべてのレコードを取り出し、右側のレコードと結合します。あなたがユーザーに関するより多くの情報が必要な場合は、あなたが本当にこれらすべての6行を必要とする

SELECT  tbl_contract.id, COUNT(*) AS userCount 
FROM  tbl_contract 
LEFT JOIN tbl_contract2user ON tbl_contract.id = tbl_contract2user.contractID 
WHERE  tbl_contract2user.pending = 0 
AND   tbl_contract.startDate <= {$billing['start_time']} 
AND   tbl_contract.endDate >= {$billing['end_time']} 
GROUP BY tbl_contract.id 

:あなただけの契約は、することができますあなたのGROUP BY句およびCOUNT(*)を持っているどのように多くのユーザーを知りたい場合は...

+0

ああ、良い点。それは愚かな間違いだった....実際の問題は、私は1つの契約で6人のユーザーがいる場合、その契約の1行の代わりに6行返される... – Shackrock

+0

ありがとう、私はこれが動作していると思います。 LEFTとINNERの結合の違いを見るのには問題がありますが...私はこれらを理解していると思っていましたが、この場合、私はちょっと混乱しています。ありがとう! – Shackrock

+1

@Shackrock:これを見てください:http://stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer-join – CodeZombie

関連する問題