gpt4 book ai didi

sql - mysql 有条件连接

转载 作者:行者123 更新时间:2023-11-29 15:01:40 26 4
gpt4 key购买 nike

我目前正在处理包含表的 MySQL 查询:

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

此表包含特定“类(class)类型”的费用,并且有不同的“费用名称”(fee_type)。这意味着该表中对于一种“类(class)类型”可以有多个条目

在我的查询中,我通过“lesson_type”表将此表连接到查询的其余部分,使用:

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

问题在于它当前在结果中返回重复的数据。 “类(class)费用”表中的每个重复条目占 1 行。

我还使用此“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>

最佳答案

请学会在 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

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

关于sql - mysql 有条件连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com