繁体   English   中英

MySQL中的一对多查询

[英]One-to-many Query in 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)  
);  

(Rent表中有month和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在下面说的话我应该使用group by(我知道我在某处误解,因为它只显示了每年的第一个例子):
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
Bob NULL 700 700

如果您有MONTH和YEAR列,则可以执行GROUP BY以根据需要选择已支付的金额。 如果您有PAID_DATE列,则执行此操作的一种方法是在设置PAID_DATE时运行BEFORE INSERT触发器。 这样,用户无需输入值,并且可以保证数据完整性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM