2013-05-02 4 views
0

В настоящее время я запускаю функцию, которая использует внутреннее соединение в цикле while, которое не возвращает ничего назад.INNER JOIN возвращающийся непредвиденный NULL (PHP/MySQL)

$data3 = '\'' . implode('\', \'', $posted_email) . '\''; 

$exam_recordation = mysql_query("SELECT * FROM exam WHERE partner_id IN (SELECT partner_id FROM exam WHERE Student_email = $data3) AND Student_email <> $data3"); 
//$name_query = mysql_query("SELECT student.email, student.name, Student_email FROM student INNER JOIN exam ON student.email = exam.Student_email WHERE student.email = $data3") 

echo "<table border=='1'> 
<tr> 
<th>Name</th> 
<th>Email</th> 
<th>Exam Date</th> 
<th>Level</th> 
<th>Mark</th> 
    <th>Style</th> 

</tr>"; 

while($row = mysql_fetch_array($exam_recordation)) 
    { 
    echo "<tr>"; 
$name_query = mysql_query("SELECT DISTINCT student.name 
       FROM student 
       INNER JOIN exam ON student.email = exam.Student_email 
       WHERE student.email <>{$data3}"); 
//die(); 
/*while($row1 = mysql_fetch_array($name_query)) 
    { 
    echo "<td>" . $row1['name'] . "</td>"; //This while loop was just me overcomplicating it, soon worked out I didnt need it 
    }*/ 
    echo "<td>" . $name_query['name'] . "</td>"; 
    echo "<td>" . $row['Student_email'] . "</td>"; 
    echo "<td>" . $row['examDate'] . "</td>"; 
    echo "<td>" . $row['level'] . "</td>"; 
    echo "<td>" . $row['mark'] . "</td>"; 
     echo "<td>" . $row['style'] . "</td>"; 

    echo "</tr>"; 
    } 
echo "</table>"; 

С моей попытки отладить ее, я понял, что она возвращается не значение я желаю (имя из таблицы студента), но значение NULL, когда я запускаю его в отдельной функции PHP на его собственный, т. е. не внутри цикла while, показанного ниже.

$data3 = '\'' . implode('\', \'', $posted_email) . '\''; 
var_dump($posted_email); 
var_export($data3); 
$name_query = mysql_query("SELECT DISTINCT student.name 
       FROM student 
       INNER JOIN exam ON student.email = exam.Student_email 
       WHERE student.email <> $data3"); 
var_export($name_query); 
echo "SELECT DISTINCT student.name 
       FROM student 
       INNER JOIN exam ON student.email = exam.Student_email 
       WHERE student.email <> $data3"; 

Однако, когда я бегу echo'd INNER JOIN из этого последнего бита кода в SQL он отлично работает и возвращает 2 строки имен.

SELECT DISTINCT student.name FROM student INNER JOIN exam ON student.email = exam.Student_email WHERE student.email <> '[email protected]' 

Теории я работаю в стороне что-то вдоль линий:

$name_query = mysql_query("SELECT DISTINCT student.name 
       FROM student 
       INNER JOIN exam ON student.email = exam.Student_email 
       WHERE student.email <>{$data3}"); 
while($row = mysql_fetch_array($exam_recordation) && mysql_fetch_array($name_query)) 
    { 
    echo "<tr>"; 
    echo "<td>" . $row['name'] . "</td>"; 
    echo "<td>" . $row['Student_email'] . "</td>"; 
    echo "<td>" . $row['examDate'] . "</td>"; 
    echo "<td>" . $row['level'] . "</td>"; 
    echo "<td>" . $row['mark'] . "</td>"; 
     echo "<td>" . $row['style'] . "</td>"; 

    echo "</tr>"; 
    } 
echo "</table>"; 

Это ничего не возвращает к моему столу, но то, что я пытаюсь сделать, это использовать оба запрос в одной выборке так чтобы привести их результаты в строку $ row и получить соответствующие данные. Это на самом деле звучит довольно далеко, поэтому, если принять на себя это как неопытность с моей стороны по вине.

Как я надеюсь, вы можете видеть, я попытался выяснить, в чем проблема, но не удалось. Обычно просто проверяя правильность отправленного запроса, исправлена ​​такая проблема, когда ничего не возвращается для меня в прошлом, но не так, похоже, для этой проблемы. Может быть, это то, чего я пропускаю с помощью массива или цикла while, может и нет. На самом деле у меня кончились идеи.

ответ

0

У вас есть несколько результатов для этого студента?

INNER JOIN будет возвращать результаты только тогда, когда данные имеются в обеих соединенных таблицах.

Попробуйте использовать LEFT JOIN, чтобы узнать, вернется ли он.

Также проверьте свои запросы в чем-то вроде phpMyAdmin или консоли MySQL, чтобы решить, является ли это причиной ошибки при обработке результатов.

+0

Да, я уверен. Я использовал консоль SQL как таковой в myphpadmin для проверки запроса, который вышел из эха запроса INNER JOIN, и он возвратил 2 строки. Я предполагаю, что это то, что вы имеете в виду. – madman

+0

phpmyadmin, а это не myphpadmin. – madman

0

Вы прокомментировали метод извлечения, он не будет работать без него. Это путь вы должны принять имя:

$rowStudent = mysql_fetch_array($name_query); 
echo "<td>" . $rowStudent['name'] . "</td>"; 

mysql_query только посылает и запрос Выполнение выражений, чтобы получить необходимые результаты выборки.

Также вы можете проверить, получили ли вы результаты с if($rowStudent) или if(!$rowStudent), чтобы обработать результаты.

+0

Правильно, сначала спасибо за то, что нашли время, чтобы помочь. Я попробовал ваше решение, используя ваш код для замены: 'echo '". $ name_query ['name']. ""; 'Он отображает имя, но использует первое имя для покрытия всех результатов.Например, к концу этой функции у меня есть две строки, у которых оба имеют имя первой записи, но должны быть только в первой из двух записей, т. Е. Результат 1 имеет имя bob, результат 2 имеет имя bob, когда оно должно быть в качестве примера того, что происходит. Поместил бы ваш бит кода внутри цикла while, который я прокомментировал? – madman

+0

Просто попробовал добавить свой бит кода в мой прокомментированный цикл while и все, что он сделал, теперь он использует имя второго результата для обоих результатов, чтобы имя для результата 1 теперь было mary, когда оно должно быть bob и result 2 name Правильно соблюдается mary до примера. – madman

+0

Но вы всегда ищете student.email <> {$ data3}, так как $ data3 не изменяется, вы получите всегда тот же результат. Или у вас может быть более одной комбинации электронной почты или электронной почты? Вы также должны иметь возможность написать все в одном запросе, я отредактирую ответ с запросом. – fbiagi

0

Вы должны попробовать это, у него есть только один запрос, который объединяет две таблицы.

$data3 = '\'' . implode('\', \'', $posted_email) . '\''; 

$exam_recordation = mysql_query("SELECT student.name, exam.Student_email, 
      exam.examDate, exam.level, exam.mark, exam.style 
      FROM student INNER JOIN exam ON student.email = exam.Student_email 
      WHERE student.email <> $data3"); 

echo "<table border=='1'> 
<tr> 
<th>Name</th> 
<th>Email</th> 
<th>Exam Date</th> 
<th>Level</th> 
<th>Mark</th> 
    <th>Style</th> 

</tr>"; 

while($row = mysql_fetch_array($exam_recordation)) 
    { 
    echo "<tr>"; 

    echo "<td>" . $row['name'] . "</td>"; 
    echo "<td>" . $row['Student_email'] . "</td>"; 
    echo "<td>" . $row['examDate'] . "</td>"; 
    echo "<td>" . $row['level'] . "</td>"; 
    echo "<td>" . $row['mark'] . "</td>"; 
     echo "<td>" . $row['style'] . "</td>"; 

    echo "</tr>"; 
    } 
echo "</table>"; 
+0

запись экзамена находит, согласно вставленному электронному письму, любой другой в таблице экзамена с тем же партнером, что и они, в любой строке экзамена, на которой они были найдены. Таким образом, [email protected] имеет две записи в таблице экзаменов с партнерскими_ими 1 и 2, все остальные партнеры с этими идентификаторами выбраны. Предполагаемое использование INNER JOIN заключалось в том, чтобы получить имя зарегистрированного экзамена, полученное от студента, со своего адрес электронной почты, найденный в таблице экзаменов. Ваш запрос выглядит смешанным, и он возвращает всех, кроме человека со связанным письмом, используемым для выполнения запроса, то есть как data3. – madman

+0

Попробуем посмотреть, смогу ли я сделать запрос так, как пожелаю, но помощь будет оценена, если у вас есть какие-либо предложения о том, как это должно быть. – madman

+0

'ВЫБОР student.name, exam.Student_email, \t \t exam.examDate, exam.level, exam.mark, exam.style, exam.partner_id \t \t от студента INNER JOIN экзамен student.email = exam.Student_email \t \t WHERE student.email <> '[email protected]' И exam.partner_id = 1 'больше похоже на то, что я ищу с большим, если есть, если можно сделать, чтобы последнее условие WHERE имело несколько значений, как на когда он вернет правильный результат для электронной почты, который является частью только одной пары. Как насчет электронной почты, которая отличается от одной пары в этой таблице? – madman