我需要提出一个要求,要求所有本月借书证到期且尚未将书退还给图书馆的人参加。我已请求找到其借书证在本月结束的人:
select reader.nameReader from reader where year(reader.validityOfTicket)=year(current_date()) and month(reader.validityOfTicket)=month(current_date())
and day(reader.validityOfTicket)>day(current_date())
但不是我不能让所有还没有把书还给图书馆的人。如果有人拿了一本书,它就会history.actionHistory
像“给”一样显示。如果有人带回一本书,则显示为history.actionHistory
“ Take”。这是我的桌子。请帮助!
create table author(
idAuthor int auto_increment NOT NULL,
nameAuthor VARCHAR(30) NOT NULL,
surnameAuthor VARCHAR(40),
PRIMARY KEY(idAuthor)
);
create table book(
idBook int NOT NULL,
title varchar(20) NOT NULL,
publishingHouse varchar(60) NOT NULL,
publishingDate DATE NOT NULL,
location VARCHAR(30) NOT NULL,
accessType enum('Full','Restricted') NOT NULL,
currentState enum('Store','Reader'),
idAuthor int NOT NULL ,
PRIMARY KEY(idBook),
foreign Key (`idAuthor`) references `author`(`idAuthor`)
ON DELETE CASCADE ON UPDATE CASCADE
);
create table reader(
idReader int auto_increment NOT NULL,
surnameReader varchar(30) NOT NULL,
nameReader varchar(30) NOT NULL,
patronymicReader varchar(30) NOT NULL,
validityOfTicket DATE NOT NULL,
category enum('Full', 'Restricted') NOT NULL,
PRIMARY KEY(idReader)
);
create table history(
idHistory int auto_increment NOT NULL,
dateHistory DATE NOT NULL,
actionHistory enum('Give','Take'),
idReader int NOT NULL,
idBook int NOT NULL,
PRIMARY KEY(idHistory),
foreign key (`idReader`) REFERENCES `reader`(`idReader`)
ON DELETE CASCADE ON UPDATE CASCADE
);
对于初学者,您可以使用MySQL的LAST_DAY()
功能,如下所示:
reader.validityOfTicket >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND reader.validityOfTicket < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY
查找本月到期的票。如果这样做,您将可以在validityOfTicket
列上使用索引来加快查询速度。
然后,对于每位图书馆主顾,您都必须数出“已赠送”而非“已接受”的书籍。这样的事情可能会起作用。
SELECT idReader,
SUM( CASE WHEN actionHistory = 'Give' THEN 1
WHEN actionHistory = 'Take' THEN -1
ELSE 0 END ) booksGiven
FROM history
GROUP BY idReader
然后,您可以将该摘要查询视为子查询,并将其与另一个查询连接。
select reader.nameReader
from reader
join (
SELECT idReader,
SUM( CASE WHEN actionHistory = 'Give' THEN 1
WHEN actionHistory = 'Take' THEN -1
ELSE 0 END ) booksGiven
FROM history
GROUP BY idReader
) books on reader.readerId = books.readerId
where reader.validityOfTicket >= LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH
and reader.validityOfTicket < LAST_DAY(CURRENT_DATE()) + INTERVAL 1 DAY
and books.booksGiven > 0
您对读者有一个判断标准:本月票证到期。您在书籍上还有另一个标准:不止一个已签出。诀窍是让每个查询分开工作,然后加入它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句