mysql用条件连接

时间:2010-05-28 23:11:15

标签: sql mysql join

我目前正在处理包含表格的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

这个问题是它当前正在返回结果中的重复数据。 “课程费用”表中每个重复条目的一行。

我也使用'fee_type_id'

加入'费用类型'表

有没有办法告诉MySQL说“加入有lesson_fee.lesson_type_id和fee_type_id = client.fee_type_id的lesson_fee表行。”

更新:查询:

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 个答案:

答案 0 :(得分:1)

请学会正确使用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

交叉连接是笛卡尔积。如果你没有在MySQL的INNER JOIN中指定标准(IE:ON ....) - 结果是交叉加入/笛卡尔积。

仅在需要同时执行一项或多项操作时使用括号。例如:

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

...将从:

返回不同的结果集
WHERE (a = b AND c = d) OR c = e

您只能使用括号 AFTER 条款的ON部分 - 没有嵌套。嵌套来自连接标准本身。我尝试构建我的查询,使其自上而下读取,以便根据连接条件,您可以看到一个表与下一个表的关系。 IE如果你有一个与两个或多个表相关的表,它应该在列表中高于其他表,因为其他表依赖于它。以TIMETABLE为例......

答案 1 :(得分:0)

这几乎就是你用英语写的

“加入具有lesson_fee.lesson_type_id和fee_type_id = client.fee_type_id”的lesson_fee表行。

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表中返回一行,而不是每种费用类型中的一行。