#mysql #left-join #conditional-statements
#mysql #слева-объединение #условные операторы
Вопрос:
Я использую следующий запрос, но не получаю точного результата. В этом запросе я использовал два условия, первое из которых является общим значением в обеих таблицах, т.е. студенты, сборы. Второй проверяет соответствие с переменной «cid»
SELECT *, students.student_id as studid, sum(fees_amount) as total_paid
FROM students
LEFT JOIN fees ON fees.class_id='$_GET[cid]' AND students.student_id=fees.student_id
GROUP By students.student_id ORDER by student_name
Есть ли что-то неправильное в использовании таких двух условий. (Я думаю, что нет необходимости в деталях таблицы для ответа)
Комментарии:
1. Это правильный способ сделать это с помощью
OUTER JOIN
. Было бы ошибкой переносить условие, которое проверяет значение в левой объединенной таблице,fees
вWHERE
предложение, потому что это изменило быLEFT JOIN
наINNER JOIN
.2. У вас особая проблема с вашим запросом: все значения в столбцах из таблицы сборов в вашем результирующем наборе недетерминированы, единственное исключение — ваше
sum(fees_amount) as total_paid
, я цитирую из руководства : Сервер волен выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. Это ваша проблема?3. Работает ли этот измененный код?
SELECT *, students.student_id as studid, sum(fees_amount) as total_paid FROM students LEFT JOIN fees ON students.student_id=fees.student_id WHERE fees.class_id='$_GET[cid]' GROUP By students.student_id ORDER by student_name
4. Все столбцы из таблицы students должны быть одинаковыми для одного и того же
studend_id
. Если вы получаете другие данные, чем ожидаете, я предполагаю, что это должны быть данные в столбцах изfees
таблицы.5. Вы должны добавить минимальный пример (две таблицы с минимальным количеством столбцов) и результат, который вы хотите. Это облегчило бы помощь любому.
Ответ №1:
да, ваш запрос и условие будут работать абсолютно нормально, но проблема может быть в $ _GET.
1) Сначала проверьте, установлен $ _GET [‘cid’] или нет, это означает, что нужно проверить, существует ли индекс
2) попробуйте сохранить это в другой переменной, такой как $value=$_GET[«cid»];
3) если это все еще не работает, вы захотите заменить его filter_input и input_post
$valuee=filter_input(INPUT_POST,"cid")
а затем выполните сбор.class_id=’$valuee’