在MySQL中,一對(duì)多關(guān)系是指一個(gè)表的一個(gè)字段可以與另外一張表中的多個(gè)字段相對(duì)應(yīng)。處理一對(duì)多關(guān)系的方法通常是使用外鍵約束和JOIN語(yǔ)句。
假設(shè)我們有兩張表,一張是訂單表Order,一張是訂單詳情表OrderDetail。訂單表中的每一條記錄對(duì)應(yīng)著多個(gè)訂單詳情記錄,因此訂單表和訂單詳情表之間就存在著一對(duì)多關(guān)系。
CREATE TABLE Order ( id INT PRIMARY KEY, order_date DATE, customer_name VARCHAR(50) ); CREATE TABLE OrderDetail ( id INT PRIMARY KEY, order_id INT, product_name VARCHAR(50), quantity INT, price FLOAT, FOREIGN KEY (order_id) REFERENCES Order(id) );
上述的外鍵約束表示OrderDetail表的order_id字段必須是Order表的id字段中的其中一個(gè),即OrderDetail表的每個(gè)訂單詳情記錄必須與Order表中的某個(gè)訂單相對(duì)應(yīng)。
處理一對(duì)多關(guān)系最經(jīng)典的方法是使用JOIN語(yǔ)句:
SELECT Order.id, Order.order_date, Order.customer_name, OrderDetail.product_name, OrderDetail.quantity, OrderDetail.price FROM `Order` INNER JOIN OrderDetail ON Order.id = OrderDetail.order_id;
上述語(yǔ)句會(huì)將Order表和OrderDetail表進(jìn)行JOIN操作,輸出每一筆訂單與訂單詳情的記錄。如果需要按照訂單進(jìn)行分組,可以使用GROUP BY語(yǔ)句:
SELECT Order.id, Order.order_date, Order.customer_name, SUM(OrderDetail.quantity * OrderDetail.price) AS total_price FROM `Order` INNER JOIN OrderDetail ON Order.id = OrderDetail.order_id GROUP BY Order.id;
上述語(yǔ)句會(huì)將每個(gè)訂單的所有訂單詳情對(duì)應(yīng)的金額相加,輸出每個(gè)訂單的總金額。這就是一對(duì)多關(guān)系的處理方式。