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

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

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 개의 열을 포함해야합니다.”라는 오류를 표시합니다.

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

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



답변

하위 쿼리가 두 개의 열을 선택하는 동안 하나의 열을 투영하는 데 사용합니다 (외부 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


답변

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

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


답변

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

예 :

WHERE product_id = (1,2,3);


답변

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)
...


답변

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

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;

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


답변

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

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,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!