2010-08-09 28 views
3

在MySQL中查詢一對多的最佳方式是什麼?這是我的工作(如果有的話看起來不正確的告訴我)數據庫的一個簡化版本:MySQL中的一對多查詢

CREATE TABLE Tenant( 
    tenant_id int NOT NULL, 
    first_name varchar(20), 
    last_name varchar(20), 
    PRIMARY KEY (tenant_id) 
); 

CREATE TABLE Rent( 
    tenant_id int NOT NULL, 
    month enum('JAN', 'FEB', ...), 
    date_paid date NOT NULL, 
    amount_paid int NOT NULL, 
    FOREIGN KEY (tenant_id) REFERENCES Tenant(tenant_id) 
); 

(原因有一個月,date_paid在租金錶,因爲承租人不必須一次支付全部租金)。我想讓租戶的名字出現一次,這只是一個左連接,但我希望每個租戶都將特定月份中支付的所有金額列爲列,但我不確定如何去解決這個問題。我不確定如何做到這一點,因爲你正在處理未知數量的列,在MySQL中還沒有涉及到。還是有更好的策略?另外,我將如何去創建像MONTH-YEAR這樣的自己的變量(我不認爲它是MySQL中的本地變量)。謝謝!

編輯: 只是爲了簡化進一步我使用這種格式:

create table rent(
tenant_id int not null,
year year,
amount_paid int,
foreign key (tenant_id) references tenant(tenant_id)
);

如果我沒有理解什麼duffymo說,下面我應該用組(我知道我誤解的地方,因爲它只能顯示第一每年的例子):
SELECT Tenant.first_name, Rent.year, Rent.amount_paid
FROM Tenant
LEFT JOIN Rent
ON Tenant.tenant_id = Rent.tenant_id
GROUP BY year;

這就是我想要查詢的樣子,每年下的數字是支付的數額(我實際上剛剛意識到它比我如何解釋有點複雜一點):

FIRST_NAME 2009 2008 2007
約翰500 500 NULL
安1000 NULL NULL
鮑勃NULL 700 700

回答

0

如果你有月份和年份列,你可以做一個GROUP BY選擇支付金額打破了你'祝願。如果您有PAID_DATE列,則一種方法是在設置PAID_DATE時運行BEFORE INSERT觸發器。這樣用戶就不必輸入數值,數據的完整性就可以得到保證。

+0

好吧,這聽起來像一個好主意,但我不知道如何處理可變數量的列。 – MCH 2010-08-10 02:15:07

+0

表中的列數不變;這是一個一對多的關係。在您編寫的查詢中會得到可變數量的結果。 – duffymo 2010-08-10 09:23:25

+0

是的,你是對的。這就是我的意思,在結果查詢中。我編輯了我原來的帖子,因爲我仍然有點麻煩。 – MCH 2010-08-10 16:20:04