Когда я вкладываю запрос в другой запрос, я получаю сообщение об ошибке «Операнд SQL error 1241 должен содержать 5 столбцов»

#mysql #subquery #where-clause

#mysql #подзапрос #where-предложение

Вопрос:

 SELECT *
FROM AUTHOR
WHERE FLOOR(DATEDIFF(bDate,CURDATE())/365.25*-1) > 30 AND
    (SELECT a.*
    FROM AUTHOR a 
    WHERE (SELECT count(paperId) from AUTHOR_PAPER ap where ap.authorId = a.aEmail)) > 3
 

Оба этих запроса работают сами по себе, я просто хочу иметь возможность узнать оба предложения where

Таблицы

 author
(aEmail*
,fName
,lName
,bDate
,city
)

reviewer
(rEmail*
,phoneNumber
,lName
,fName
,city
)

paper
(paperId*
,title
,abstract
,submissionDate
)

author_paper
(authorId*
,paperId*
,isContact
)

paper_review
(paperId*
,reviewerId*
,score 
,reviewSubmissionDate
,reviewInvitationDate
)

* = (component of) PRIMARY KEY
 

Ошибка, которую я получаю: 17:05:14 ВЫБЕРИТЕ * ОТ АВТОРА, ГДЕ FLOOR(DATEDIFF(bDate,CURDATE())/365.25-1) > 30 И (ВЫБЕРИТЕ a. ИЗ AUTHOR a, ГДЕ (ВЫБЕРИТЕ count(*) из AUTHOR_PAPER ap, где ap.AuthorID = aEmail)) > 3ОГРАНИЧЕНИЕ 0, 1000 Код ошибки: 1241. Операнд должен содержать 5 столбцов 0,000 сек.

aEmail = AuthorID

Комментарии:

1. Вероятно, это должно быть a JOIN , поскольку a SELECT внутри a SELECT внутри a SELECT немного многовато.

Ответ №1:

Похоже, вам нужны авторы старше 30 лет, которые выпустили более 3 статей. Если это так, я бы рекомендовал:

 select *
from author a
where 
    bdate <= current_date - interval 31 year
    and (select count(*) from author_paper ap where ap.authorid = a.email) > 3
 

Комментарии:

1. Однако вопрос. Является ли более эффективным выполнение объединения, группирования и наличия в конце? Или нет разницы?

2. как мне вернуть только определенные значения из таблицы, например, я хочу вернуть только идентификатор автора

3. @Ergis: решение подзапроса должно быть эффективным подходом. Вы можете изменить select предложение и перечислить author интересующие вас столбцы.

4. @GMB как бы я настроил таблицы, чтобы выяснить, могут ли статьи иметь более одного автора.