Условия, используемые при объединении двух таблиц

#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’