2016-09-29 4 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 представляет собой «учетные записи», а таблица 2 - «qs_quotationinformation».

Есть некоторые счета в таблице 1, которые имеют несколько записей в таблице 2, и некоторые из «takenup» записей в таблице 2 (относящихся к одной и той же учетной записи) может быть 1, а некоторые быть 0.

Так мне нужно сделать так, чтобы, если какая-либо из записей в таблице 2 = 1, то все переменные $ NLC должны = «Нет».

Я не знаю, возможно ли это, или если есть лучший способ получить эту информацию. В таблице html отсутствуют данные, которые извлекаются, но это потому, что таблица представляет собой просто визуальное представление наиболее важных данных пользователю.

редактировать таблицы (за исключением личных данных):

Таблица 1: +----+---------+---------+ | id | name | deleted | +----+---------+---------+ | 1 | example | 0 | +----+---------+---------+

Таблица 2: +----+---------+ | id | takenup | +----+---------+ | 1 | 0 | +----+---------+ | 2 | 1 | +----+---------+ | 3 | 0 | +----+---------+

Все строки в таблице 2, относятся к строке в таблице 1. Но так как это строка с takeup = 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 поля в других записях.

В этом случае вам нужно получить список учетных записей, которые имеют qs_quotationinformation.takenup = 1, и вы можете использовать подзапрос, чтобы вернуть эту информацию, которая может быть оставлена ​​присоединенной к основному запросу. accounts_cstm.nolongercontact_c AS NLC будет изменен на выражение case, чтобы вернуть значение «Нет» на основе подзапроса.

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 поле типа String (CHAR, VARCHAR и т.д.). Если это не так, то вам нужно передать значение accounts_cstm.nolongercontact_c в поле char, используя функцию cast().

+0

Нет, я, вероятно, должен был использовать другую переменную для AS для nolongercontact_c. Что она должна делать, так это если есть какая-либо учетная запись, которая имеет хотя бы одно вхождение 'accounts_cstm.nolongercontact_c' или' qs_quotationinformation.takenup', где он имеет значение 1, тогда для переменной $ NLC необходимо установить значение «Нет».В противном случае ему нужно установить значение «Да» – Jordan

+0

Затем просто измените выражение 'case' выше, чтобы вернуть' 'Yes'' вместо' account_cstm.nolongercontact_c'. – Shadow

Смежные вопросы