2012-04-03 1 views
1

나는 라이브러리 시스템을 기반으로하는 데이터베이스를 가지고 있으며 MYSQL 쿼리에 대한 지식을 향상 시키려고 노력하고 있습니다. 나는 데이터베이스에있는 모든 책 제목을 빌린 차용자의 이름을 나열하려고합니다. '다른 쿼리의 모든 것을 포함하는 요소를 선택하는 MYSQL

나는 아래로 제거해야 할 요청

SELECT b.BorName 
FROM Borrower b 
JOIN Loan l ON l.BorId = b.BorId 
JOIN BookCopy bc ON bc.BcId = l.BcId 
JOIN BookTitle bt ON bt.BtId = bc.BtId 

입니다 그리고 나는 위의 쿼리뿐만 아니라 서브 쿼리 SELECT bt.BtName FROM BookTitle bt 각 책의 이름입니다 bt.BtName를 사용할 필요가 생각하지만 난 돈 전체 목록에서이를 수행 할 단어 나 쿼리.

두 번째 쿼리의 첫 번째 테이블을 모든 행과 비교해야하지만 아직 수행 할 방법을 찾고 있습니다.

SELECT BorName FROM (
    SELECT DISTINCT b.BorName, bt.BtId 
    FROM Borrower b 
    JOIN Loan l ON l.BorId = b.BorId 
    JOIN BookCopy bc ON bc.BcId = l.BcId 
    JOIN BookTitle bt ON bt.BtId = bc.BtId 
) borrowers_titles 
GROUP BY BorName 
HAVING Count(*) IN (SELECT Count(*) FROM BookTitle) 
+0

왜 쿼리에서 'BtName'을 사용해야한다고 생각합니까? –

+0

그럼 'BtName'또는 'BtId'중 하나를 사용할 수 있다고 생각합니다. 둘 다 같은 결과를 가져야합니다. –

+0

'BookCopy'에도 제목이있는 열이 있습니까? –

답변

1

(DISTINCT으로) 고유의 대출 제목 조합을 수집 한 후에는 GROUP BYHAVING를 사용하여 존재 booktitles의 총 수에 해당 booktitles의 수와 그 채무자를 식별 할 수 있습니다 :

SELECT b.BorName, bt.BtName 
FROM loan as l 
LEFT JOIN Borrower as b 
    ON l.BorId = b.BorID 
LEFT JOIN BookCopy as bc 
    ON bc.BcId = l.BcId 
LEFT JOIN BookTitle as bt 
    ON bt.BtId = bc.BtId 
GROUP BY b.BorName 

차용인의 이름으로 그룹화 된 (또는 주문한) 모든 이름과 책을 가져옵니다. 이제 도서관의 모든 책을 빌린 사람들의 이름을 원하는 것처럼 들었습니까? 일치하는 경우 :

SELECT b.BorName 
Borrower as b 
WHERE 
    (SELECT count(distinct BtId) FROM BookTitle) = 
     (SELECT count(distinct bc.BcID) FROM BookCopy as bc WHERE bc.BorID = b.BorID) 
0

무엇에 대해 :

관련 문제