SELECT
writer_id
, nickname
, `전체주소`
, `전화번호`
FROM (
SELECT
b.writer_id
, u.nickname
, CONCAT(city, ' ', street_address1, street_address2) AS "전체주소"
, CONCAT(SUBSTR(tlno, 1, 3), '-', SUBSTR(tlno, 4, 4), '-', SUBSTR(tlno, 8, 4)) AS "전화번호"
, COUNT(b.writer_id) AS cnt
FROM
used_goods_board AS b
JOIN used_goods_user AS u
ON b.writer_id = u.user_id
GROUP BY
1, 2, 3, 4
) AS ug
WHERE
cnt >= 3
ORDER BY
writer_id DESC
;
→ user_id를 조회해야 하는데 writer_id를 써서 그런가? 하고 다시 고쳤는데 여전히 오답
→ 알고보니 CONCAT(city, ' ', street_address1, street_address2)
문제였음
실행 결과 화면에서 city컬럼과 street_address1컬럼 사이만 띄어쓰기가 안 되어 있는 것처럼 보이길래 공란을 하나만 넣었는데 알고 보니 컬럼과 컬럼 사이에 무조건 넣어야 했음 (잘 보면 띄어쓰기가 없다는 게 보임: '수내로 1'과 '001-004', '내정로165번길 35'와 '104-1202' 사이에 띄어쓰기 필요함)
정답으로 처리된 쿼리
SELECT
user_id
, nickname
, `전체주소`
, `전화번호`
FROM (
SELECT
u.user_id
, u.nickname
, CONCAT(city, ' ', street_address1, ' ', street_address2) AS "전체주소"
, CONCAT(SUBSTR(tlno, 1, 3), '-', SUBSTR(tlno, 4, 4), '-', SUBSTR(tlno, 8, 4)) AS "전화번호"
, COUNT(b.writer_id) AS cnt
FROM
used_goods_board AS b
JOIN used_goods_user AS u
ON b.writer_id = u.user_id
GROUP BY
1, 2, 3, 4
) AS ug
WHERE
cnt >= 3
ORDER BY
user_id DESC
;
SELECT
u.user_id
, u.nickname
, CONCAT(city, ' ', street_address1, ' ', street_address2) AS "전체주소"
, CONCAT(SUBSTR(tlno, 1, 3), '-', SUBSTR(tlno, 4, 4), '-', SUBSTR(tlno, 8, 4)) AS "전화번호"
FROM
used_goods_board AS b
JOIN used_goods_user AS u
ON b.writer_id = u.user_id
GROUP BY
u.user_id
HAVING
COUNT(*) >= 3
ORDER BY
user_id DESC
;
SELECT
user_id
, nickname
, CONCAT_WS(' ', city, street_address1, street_address2) AS "전체주소"
, CONCAT_WS('-', SUBSTR(tlno, 1, 3), SUBSTR(tlno, 4, 4), SUBSTR(tlno, 8, 4)) AS "전화번호"
FROM
used_goods_user
WHERE user_id IN (
SELECT
writer_id
FROM
used_goods_board
GROUP BY
writer_id
HAVING
COUNT(*) >= 3
)
ORDER BY
user_id DESC
;
CONCAT은 컬럼(필드) 문자열들을 결합해 하나의 열로 표현할 때 사용
CONCAT_WS는 문자열을 결합할 때마다 지정된 구문자를 사이에 넣어줌
(WS는 With Separator의 약자)
구분자를 제공하지 않으면 자동으로 구분자가 없는 CONCAT()와 동일하게 작동하며 결합할 값이 NULL이면 해당 값은 무시됨
CONCAT은 연산자 ||(Double Vertical bars, 더블 버티컬 바)로도 사용할 수 있음
단, MySCL에서는 ||가 'Logical OR'라 사용 불가
WITH user_cte AS (
SELECT
writer_id
FROM
used_goods_board
GROUP BY
writer_id
HAVING
COUNT(*) >= 3
)
SELECT
user_id
, nickname
, CONCAT_WS(' ', city, street_address1, street_address2) 전체주소
, INSERT(INSERT(tlno, 8, 0, '-'), 4, 0, '-') 전화번호
FROM
used_goods_user
WHERE
user_id IN (
SELECT
*
FROM
user_cte
)
ORDER BY
user_id DESC
;
INSERT(original_string, position, length, new_string)
-- 예시
SELECT
INSERT('01012345678', 4, 0, '-') # 010-12345678
🎯 집계함수를 이용해 조건 비교를 하고 싶으면 GROUP BY & HAVING 사용하거나 서브쿼리 사용해야 함
WHERE절에 단독으로 집계함수 쓸 수 없음(당연함. 집계 연산은 WHERE절 이후 진행임.)
CONCAT_WS(' ', CITY, STREET_ADDRESS1, COALESCE(STREET_ADDRESS2, ''))
REGEXP_REPLACE(TLNO, '(.{3})(.{4})(.{4})', '$1-$2-$3') 전화번호
def solution(num):
if num%2 > 0:
return "Odd"
else:
return "Even"
def evenOrOdd(num):
if num%2:
return "Odd"
return "Even"
def evenOrOdd(num):
return ["Even", "Odd"][num & 1]
def evenOrOdd(num):
return "Even" if num%2==0 else "Odd"