MySQL присоединиться с условным - PullRequest
0 голосов
/ 29 мая 2010

В настоящее время я работаю над запросом MySQL, который содержит таблицу:

TBL:lesson_fee
-fee_type_id (PRI)
-lesson_type_id (PRI)
-lesson_fee_amount

в этой таблице указаны сборы за определенный «тип урока», и существуют разные «названия сборов» (fee_type). Это означает, что в одной таблице может быть много записей для одного «типа урока»

В моем запросе я присоединяю эту таблицу к остальной части запроса через таблицу 'lesson_type', используя:

lesson_fee 
INNER JOIN (other joins here)
ON lesson_fee.lesson_type_id = lesson_type.lesson_type_id

Проблема в том, что в настоящее время он возвращает дублированные данные в результате. 1 строка для каждой повторяющейся записи в таблице «плата за урок».

Я также присоединяюсь к таблице «тип оплаты», используя этот «fee_type_id»

Есть ли способ заставить MySQL сказать "Соедините строки таблицы lesson_fee, у которых есть lesson_fee.lesson_type_id и fee_type_id = client.fee_type_id".

ОБНОВЛЕНИЕ: Запрос:

SELECT
lesson_booking.lesson_booking_id,lesson_fee.lesson_fee_amount
FROM
fee_type INNER JOIN
        (lesson_fee INNER JOIN
                (color_code INNER JOIN
                                (employee INNER JOIN
                                        (horse_owned INNER JOIN
                                            (lesson_type INNER JOIN
                                                    (timetable INNER JOIN
                                                        (lesson_booking INNER JOIN CLIENT
                                                        ON
                                                        client.client_id = lesson_booking.client_id)
                                                    ON
                                                    lesson_booking.timetable_id = timetable.timetable_id)
                                            ON
                                            lesson_type.lesson_type_id = timetable.lesson_type_id)
                                        ON
                                        horse_owned.horse_owned_id = lesson_booking.horse_owned_id)
                                ON
                                employee.employee_id = timetable.employee_id)
                                ON
                                employee.color_code_id = color_code.color_code_id)
                ON
                lesson_fee.lesson_type_id = lesson_type.lesson_type_id)
        ON
        lesson_fee.fee_type_id = client.fee_type_id
WHERE booking_date = '2010-04-06'
ORDER BY lesson_booking_id ASC

Обновление: вывод:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>query data</title>
<style type="text/css" <!--
.normal {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-weight: normal; color: #000000}
.medium {  font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; font-weight: bold; color: #000000; text-decoration: none}
--></style>
</head>
<body>
<h3>query result</h3><table border=1>
<tr>
<td bgcolor=silver class='medium'>lesson_booking_id</td><td bgcolor=silver class='medium'>lesson_fee_amount</td></tr>
<tr>
<td class='normal' valign='top'>0</td>

<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>0</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>0</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>0</td>

<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>5</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>5</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>5</td>

<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>5</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>9</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>9</td>

<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>9</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>9</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>11</td>

<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>11</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>11</td>
<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>11</td>

<td class='normal' valign='top'>25.00</td>
</tr>
<tr>
<td class='normal' valign='top'>13</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>13</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>13</td>

<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>13</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>16</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>16</td>

<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>16</td>
<td class='normal' valign='top'>500.00</td>
</tr>
<tr>
<td class='normal' valign='top'>16</td>
<td class='normal' valign='top'>500.00</td>
</tr>
</table>
</body></html>

Ответы [ 2 ]

1 голос
/ 29 мая 2010

Пожалуйста, научитесь правильно использовать скобки в SQL - я переписал ваш существующий запрос:

SELECT lb.lesson_booking_id,
       lf.lesson_fee_amount 
   FROM FEE_TYPE ft
   JOIN TIMETABLE tt  --cross join
   JOIN COLOR_CODE cc --cross join 
   JOIN EMPLOYEE e ON e.employee_id = tt.employee_id
                  AND e.color_code_id = cc.color_code_id
    JOIN HORSE_OWNED ho ON ho.horse_owned_id = lb.horse_owned_id
    JOIN LESSON_TYPE lt ON lt.lesson_type_id = tt.lesson_type_id
    JOIN LESSON_BOOKING lb ON lb.timetable_id = tt.timetable_id
    JOIN CLIENT c ON c.client_id = lb.client_id
    JOIN LESSON_FEE lf ON lf.lesson_type_id = lt.lesson_type_id
                      AND lf.fee_type_id = c.fee_type_id
   WHERE booking_date = '2010-04-06' 
ORDER BY lesson_booking_id ASC

Перекрестное соединение - это декартово произведение. Если вы не укажете критерии (IE: ON ....) для INNER JOIN в MySQL - результатом будет перекрестное / декартово произведение.

ИСПОЛЬЗУЙТЕ ТОЛЬКО скобки, когда одну или несколько вещей необходимо выполнить вместе . Пример:

WHERE a = b AND c = d OR c = e

... вернет другой набор результатов из:

WHERE (a = b AND c = d) OR c = e

Вы должны использовать только скобки ПОСЛЕ ON для предложения - вложения нет. Вложенность происходит из самих критериев соединения. Я пытаюсь структурировать свои запросы так, чтобы они читались сверху вниз, чтобы на основе критериев соединения вы могли видеть, как одна таблица связана с другой. То есть, если у вас есть таблица, относящаяся к двум или более таблицам, она должна быть выше в списке, чем другие, потому что другие зависят от нее. Посмотрите на РАСПИСАНИЕ в качестве примера ...

0 голосов
/ 29 мая 2010

Это почти то, что вы пишете на английском

"Соединить строки таблицы lesson_fee, у которых есть lesson_fee.lesson_type_id и fee_type_id = client.fee_type_id".

FROM lesson_fee 
INNER JOIN client ON 
  lesson_fee.lesson_type_id=client_lesson_type_id AND  
  lesson_fee.fee_type_id=client.fee_type_id 

Если предположить, что lesson_fee (lesson_type_id, fee_type_id) уникален, то будет возвращена одна строка из таблицы lesson_fee, а не одна для каждого типа комиссии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...