我目前正在处理包含表格的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>
答案 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表中返回一行,而不是每种费用类型中的一行。