2015-12-11 2 views
0

Я вызываю запрос INNER JOIN для отображения результатов от пользователя, если у них есть информация в обеих таблицах. 1 & 2 - это работает нормально. Однако, если у указанного пользователя нет информации в обеих таблицах, тогда мои переменные возвращаются неопределенными.Вызов второго запроса, если результаты пустые

Поэтому я хотел бы вызвать свой запрос INNER JOIN, и если строки пустые для таблицы 1, он вызовет второй запрос для отображения результатов из таблицы2.

(Table2, безусловно, имеет информацию, хранящуюся. Table1 не является обязательным в зависимости от пользователя)

Я также хочу, чтобы отобразить результаты Таблицы 1 & 2, если другой пользователь имеет информацию в обоих, я не могу показаться, чтобы получить его за работой. Вот что я до сих пор;

$sql="SELECT * FROM Table1 INNER JOIN Table2 ON Table1.username = Table2.username WHERE Table1.username='" . $_SESSION['username']['1'] . "'"; 

$result=MySQL_Query($sql); 
if (mysql_num_rows($result)==0) 
{ 
    $sql2"SELECT * FROM Table2 WHERE username='" . $_SESSION['username']['1'] . "'"; 
    $result2=MySQL_Query($sql2); 
} 

while ($rows=mysql_fetch_array($result)($result2)) 
{ 
    $Username = $rows['username'] ." "; 
    $Email = $rows['email'] . " "; 
} 

echo $Email; ?> 
+0

Почему бы не использовать внешнее соединение, а затем один запрос всегда будет возвращать данные? – sgeddes

+2

Прежде чем ответить, я уберу их с пути: во-первых, драйвер 'mysql' устарел; используйте 'mysqli' или' PDO'. Во-вторых: ваш код уязвим для SQL-инъекции; использовать подготовленные заявления. В-третьих, исходный код предназначен для чтения людьми и должен быть отформатирован соответствующим образом. В-четвертых, этот код на самом деле не запускается, не так ли? –

ответ

0

Вы можете переписать запрос с внешним соединением следующим образом:

select 
    t1.desired_info 
    t2.desired_info 
from 
    table2 as t2 
     left outer join 
    table1 as t1 
     on (t2.username = t1.username) 
where 
    t2.username = target_username; 

где положение сузит результирующий набор вниз к пользователю интереса и возвращать 0 строк, если target_username не существует , t2.desired_info всегда будет возвращаться, а t1.desired_info будет null, если этот пользователь не присутствует в этой таблице.

Сначала вы можете проверить p1.desired_info в своем php-коде, и если это не отображается, используйте p2.desired.

0

Echo предложение использовать ВНЕШНИЕ СОБЫТИЯ, который объединяет все выбранные строки в левой таблице с соответствующими строками справа или в пустую строку, если нет соответствующих строк справа.

Кроме того, я переписал для использования PDO и подготовленное заявление, чтобы показать вам, как это делается. Значения в переменных $dbhost, $dbname, $dbuser и dbpassword предоставляются кодом.

<?php 
    $dsn = "mysql:host=$dbhost;dbname=$dbname"; 
    $dbh = new PDO($dsn, $dbuser, $dbpassword); 

    $sql = "SELECT * 
       FROM table2 t1 
       LEFT JOIN table1 t1 ON t1.username = t2.username 
       WHERE t2.username = :username"; 

    // prepare() parses and compiles the query. Syntax error come out here. 
    $stmt = $dbh->prepare($sql); 
    // bindValue() handles quoting, escaping, type-matching and all that crap for you. 
    $stmt->bindValue(':username', $_SESSION['username']['1']); 
    $stmt->execute(); 
    while ($row = $stmt->fetch(PDO::FETCH_BOTH)) 
    { 
     $Username = $rows['username'] ." "; 
     $Email = $rows['email'] . " "; 
     // and then do something useful with them 
    } 

Применение подготовленного заявления здесь дает значительную меру защиты от SQL injection attacks. Как обычно, я оставляю обработку ошибок как упражнение для читателя.

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