2016-09-29 5 views
0

MYSQLの関係には小さな問題があります。とき、いくつかのテーブルで関連する行に文字列が含まれているMYSQLとPHP

表1内のすべての1つの値に対して存在し、値が多数存在することができます(0+)2.

私が正しく、すべてのデータを取得することができていますが、しかし、問題が来ます表2の値は異なります。具体的には、「取り上げられた」フィールドです。

$sql = " 
     SELECT 
      accounts.name AS business, 
      accounts.industry AS style, 
      accounts_cstm.renewaldate_c AS ren_date, 
      accounts_cstm.nolongercontact_c AS NLC, 
      accounts_cstm.contactname_c AS person, 
      campaigns.name AS campaign, 
      users.first_name AS exec_fn, 
      users.last_name AS exec_sn, 
      email_addr_bean_rel.bean_id AS bean_id, 
      email_addresses.email_address AS email, 
      qs_quotationinformation.takenup AS takeup, 
      email_addr_bean_rel.email_address_id AS email_id 
     FROM 
      accounts 
       LEFT JOIN 
      campaigns ON accounts.campaign_id = campaigns.id 
       LEFT JOIN 
      users ON accounts.assigned_user_id = users.id 
       INNER JOIN 
      accounts_cstm ON accounts.id = accounts_cstm.id_c 
       LEFT JOIN 
      email_addr_bean_rel ON accounts.id = email_addr_bean_rel.bean_id 
       LEFT JOIN 
      email_addresses ON email_addr_bean_rel.email_address_id = email_addresses.id 
       LEFT JOIN 
      qs_quotamation_accounts_c ON accounts.id = qs_quotamation_accounts_c.qs_quot108funts_ida 
       LEFT JOIN 
      qs_quotationinformation ON qs_quotamation_accounts_c.qs_quotdb81tion_idb = qs_quotationinformation.id 
     WHERE 
      accounts.deleted = 0"; 
$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
    // output data of each row 
    while($row = $result->fetch_assoc()) { 
     if($row["NLC"] == 1 || $row["takeup"] == 1){$NLC = "No";}else{$NLC = "Yes";} 
     echo '<tr><td>'.$row['business'].'</td><td>'.$row["style"].'</td><td>'.$row["ren_date"].'</td><td>'.$NLC.'</td><td>'.$row["person"].'</td><td>'.$row["campaign"].'</td><td>'.$row["exec_fn"].' '.$row["exec_sn"].'</td><td>'.$row["email"].'</td><td>'.$row["takeup"].'</tr>'; 
    } 
} else { 
    echo "0 results"; 
} 

この場合、表1は「accounts」であり、表2は「qs_quotationinformation」です。

あり、表2の複数のレコードを持っている表1のいくつかのアカウントがあり、かつ(同じアカウントに関連する)表2の「takenup」レコードの一部を1にすることができ、いくつかは0

そうです私がする必要があるのは、表2のレコードのいずれかが1ならば、$ NLCのすべての変数が= "No"になる必要があるということです。

これが可能かどうか、この情報を得る良い方法があるかどうかはわかりません。 htmlテーブルには取得されたデータがありませんが、それはテーブルがユーザーにとって最も重要なデータを視覚的に表示するにすぎないためです。

EDITテーブル(個人データを除く):

表1: +----+---------+---------+ | id | name | deleted | +----+---------+---------+ | 1 | example | 0 | +----+---------+---------+

表2: +----+---------+ | id | takenup | +----+---------+ | 1 | 0 | +----+---------+ | 2 | 1 | +----+---------+ | 3 | 0 | +----+---------+

表2の行のすべての表1の行に関連するが、そこため撮影回数= 1の行ですNLCは「いいえ」を返す必要があります(最後に関連する行が0なので現在実行しています)

+0

ちょっとしたヒントは、できるだけ低めに接合してみてください.7はたくさんあります。 – Grumpy

+0

サンプルデータとテーブル構造を提供することもできます – Beginner

+0

@Grumpy残念ながら、私が処理しなければならないデータベースは、作成/使用しているプログラムのために1つのアカウントのレコードが10個以上のテーブルに分割されています – Jordan

答えて

1

あなたが正しく理解している場合は、 、それに対応するponding qs_quotationinformation.takenupの値が1の場合、accounts_cstm.nolongercontact_c AS NLCであり、他のレコードのqs_quotationinformation.takenupフィールドの値にかかわらず、同じアカウントIDを持つレコードでは「いいえ」が返されます。

この場合、qs_quotationinformation.takenup = 1のアカウントの一覧を取得する必要があります。サブクエリを使用してこの情報を返すことができます。この情報はメインクエリに結合されたままにすることができます。 accounts_cstm.nolongercontact_c AS NLCcase式に変更され、サブクエリに基づいて「いいえ」の値が返されます。

SELECT 
     accounts.name AS business, 
     accounts.industry AS style, 
     accounts_cstm.renewaldate_c AS ren_date, 
     case 
      when no_nlc.qs_quot108funts_ida is null then accounts_cstm.nolongercontact_c 
      else 'No' 
     end AS NLC, 
     accounts_cstm.contactname_c AS person, 
     campaigns.name AS campaign, 
     users.first_name AS exec_fn, 
     users.last_name AS exec_sn, 
     email_addr_bean_rel.bean_id AS bean_id, 
     email_addresses.email_address AS email, 
     qs_quotationinformation.takenup AS takeup, 
     email_addr_bean_rel.email_address_id AS email_id 
    FROM 
     accounts 
    LEFT JOIN 
     campaigns ON accounts.campaign_id = campaigns.id 
    LEFT JOIN 
     users ON accounts.assigned_user_id = users.id 
    INNER JOIN 
     accounts_cstm ON accounts.id = accounts_cstm.id_c 
    LEFT JOIN 
     email_addr_bean_rel ON accounts.id = email_addr_bean_rel.bean_id 
    LEFT JOIN 
     email_addresses ON email_addr_bean_rel.email_address_id = email_addresses.id 
    LEFT JOIN 
     qs_quotamation_accounts_c ON accounts.id = qs_quotamation_accounts_c.qs_quot108funts_ida 
    LEFT JOIN 
     qs_quotationinformation ON qs_quotamation_accounts_c.qs_quotdb81tion_idb = qs_quotationinformation.id 
    LEFT JOIN 
     (SELECT 
      qs_quot108funts_ida 
     FROM 
      qs_quotamation_accounts_c 
     INNER JOIN 
      qs_quotationinformation ON qs_quotamation_accounts_c.qs_quotdb81tion_idb = qs_quotationinformation.id 
     WHERE 
      qs_quotationinformation.takenup = 1) no_nlc ON accounts.id = no_nlc.qs_quot108funts_ida 
    WHERE 
     accounts.deleted = 0 

case発現はaccounts_cstm.nolongercontact_cフィールドは、文字列型(CHAR、VARCHARなど)であると仮定しています。これが当てはまらない場合は、cast()関数を使用して、accounts_cstm.nolongercontact_cフィールドの値をcharにキャストする必要があります。

+0

いいえ、おそらく、nolongercontact_cのためにASに別の変数を使用していたはずです。少なくとも1つの'accounts_cstm.nolongercontact_c'または' qs_quotationinformation.takenup'の値が1の場合、変数$ NLCを "No"に設定する必要があります。それ以外の場合は、 "Yes"に設定する必要があります – Jordan

+0

次に、上記の 'case'式を' accounts_cstm.nolongercontact_c'の代わりに '' Yes''を返すように変更してください。 – Shadow

関連する問題