MySQL-피연산자는 1 개의 열을 포함해야합니다.


92

내가 만드는 시스템에서 작업하는 동안 프로젝트에서 다음 쿼리를 사용하려고했습니다.

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id

": cat"은 PDO를 사용할 때 내 PHP 코드에 묶여 있습니다. 2는 ": cat"에 유효한 값입니다.

이 쿼리는 "# 1241-피연산자는 1 개의 열을 포함해야합니다."라는 오류를 표시합니다.

나를 괴롭히는 것은이 쿼리가 아무 문제없이 작동 할 것이라고 생각한다는 것입니다. 열을 선택한 다음 다른 테이블에서 두 개를 더 선택하고 거기에서 계속합니다. 나는 문제가 무엇인지 이해할 수 없습니다.

이것에 대한 간단한 수정 또는 내 쿼리를 작성하는 다른 방법이 있습니까?

답변:


103

하위 쿼리가 두 개의 열을 선택하는 동안 하나의 열을 투영하는 데 사용합니다 (외부 SELECT절의 일부로 ). 이 컨텍스트에서는 이러한 쿼리에서 하나의 열만 선택할 수 있습니다.

users대신 테이블에 조인하는 것을 고려하십시오 . 이렇게하면 원하는 열을 선택할 때 더 많은 유연성을 얻을 수 있습니다 users.

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
users.username AS posted_by,
users.id AS posted_by_id

FROM topics

LEFT OUTER JOIN posts ON posts.topic_id = topics.id
LEFT OUTER JOIN users ON users.id = posts.posted_by

WHERE topics.cat_id = :cat
GROUP BY topics.id

응답 해 주셔서 감사합니다. 내 쿼리를 수정하고 답으로 표시하겠습니다. 그러나 입력을 위해 지금 사용하는 것보다 내 쿼리를 작성하는 "더 나은"방법이 있다고 생각하십니까 (하지만 오류도 무시)?

아. 원본 게시물을 수정 해 주셔서 감사합니다. StackOverflow에서 허용하면 답변으로 표시하겠습니다. 감사합니다!

글쎄요 COUNT(). 내가 제공 한 쿼리는 아마도 집계로 인해 오류가 발생할 것입니다. 쿼리의 목표에 따라 집계를 하위 쿼리로 이동해야 할 수도 있습니다 (현재로서는 명확하지 않음).
cdhowie

17

실수로 대신 쉼표를 사용하는 경우이 오류가 발생할 수 있습니다 AND에서 ON(A)의 절을 JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

9

이 오류는 절 에서 =대신 실수로 사용하는 경우에도 발생할 수 있습니다 .INWHERE

예 :

WHERE product_id = (1,2,3);

1
또는 IN 대신 LIKE 내가 한 것처럼이 오류가 발생하는 이유를 찾을 수 없습니다. 포인터의 경우 ty.
Edgars Aivars

SELECT 절의 필드를 괄호로 묶어도 발생할 수 있습니다. 예를 들어 SELECT (Field1, Field2) FROM Table
Paul Chris Jones

6
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)

글쎄, 당신은 이와 같은 하나의 하위 쿼리에서 여러 열을 가져올 수 없습니다. 다행히 두 번째 열은 이미 posts.posted_by! 그래서:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
posts.posted_by
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by_username
    FROM users
    WHERE users.id = posts.posted_by)
...

1

제 경우 문제는 실수로 괄호로 열 선택을 둘러싼 것입니다.

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

그리고 다음과 같아야합니다.

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

어리석은 것처럼 들리지만 이로 인해이 오류가 발생했으며이를 파악하는 데 시간이 좀 걸렸습니다.


나는 이것이 내 문제라는 것을 믿을 수 없다. 나는 거기에 괄호가 합법적이라고 생각했다
Josh McGee

0

이 오류가 발생할 수있는 또 다른 위치는 문자열 외부에 쉼표가있는 값을 할당하는 것입니다. 예를 들면 :

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)

0

이 오류는 실수로 if함수 이름을 놓친 경우에도 발생할 수 있습니다 .

예를 들면 :

set v_filter_value = 100;

select
    f_id,
    f_sale_value
from
    t_seller
where
    f_id = 5
    and (v_filter_value <> 0, f_sale_value = v_filter_value, true);

함수 에 if 를 넣는 것을 놓쳤을 때이 문제가 발생했습니다 if!


0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

여기에서는 하위 쿼리를 사용하지만이 하위 쿼리는 하나의 열만 반환해야합니다. 그렇지 않으면 오류가 표시됩니다.


0

잘못된 위치에 대괄호를 추가하기 때문에 Intellij 콘솔에서 MySQL 스크립트를 실행하는 동안이 오류가 발생했습니다.

잘못된:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

권리:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

이것은 여기의 첫 번째 답변과 일치하지 않습니다 : stackoverflow.com/questions/24551177/…
rubydio

@rubydio, 그 질문은 HQL과 Hibernate를 참조하지만 내 대답은 Intellij 콘솔의 MySQL을 참조하는 것입니다
Janac Meena
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.