문제

다른 테이블에서 ID 목록을 포함시키려는 MySQL 쿼리가 있습니다. 웹 사이트에서 사람들은 특정 항목을 추가 할 수 있으며 사람들은 해당 항목을 즐겨 찾기에 추가 할 수 있습니다. 나는 기본적으로 그 항목을 선보이는 사람들의 ID 목록을 얻고 싶습니다 (이것은 약간 단순화되었지만 이것이 끓는 것입니다).

기본적으로 나는 다음과 같은 일을합니다.

SELECT *,
GROUP_CONCAT((SELECT userid FROM favourites WHERE itemid = items.id) SEPARATOR ',') AS idlist
FROM items
WHERE id = $someid

이런 식으로, 나는 나중에 Idlist를 내 코드에서 PHP의 배열로 나누어서 어떤 아이템을 선보이는 사람을 보여줄 수 있지만, 다음 mySQL 오류가 발생하고 있습니다.

1242- 서브 쿼리는 1 행 이상을 반환합니다

나는 그것이 일종의 사용 요점이라고 생각했다 GROUP_CONCAT 예를 들어, CONCAT? 내가 이것에 대해 잘못된 길로 가고 있습니까?


자, 지금까지 답변 해 주셔서 감사합니다. 그러나 캐치가 있습니다. 해당 사용자가 추가 한 경우 항목도 좋아하는 것으로 간주됩니다. 따라서 Creator = userID인지 확인하려면 추가 점검이 필요합니다. 누군가 내가 이것을 할 수있는 똑똑하고 희망적으로 효율적인 방법을 생각 해낼 수 있도록 도와 줄 수 있습니까?

고맙습니다!

편집 : 방금 이것을 시도했습니다.

SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)

그리고 유약 비었다. 내가 사용하는 경우에 유의하십시오 INNER JOIN 대신에 LEFT JOIN 나는 빈 결과를 얻는다. 비록 나는 요구 사항을 충족시키는 행이 있다고 확신하지만.

도움이 되었습니까?

해결책

그러한 쿼리에서 외부 범위의 변수에 액세스 할 수 없습니다 (사용할 수 없습니다. items.id 거기). 당신은 오히려 같은 것을 시도해야합니다

SELECT
    items.name,
    items.color,
    CONCAT(favourites.userid) as idlist
FROM
    items
INNER JOIN favourites ON items.id = favourites.itemid
WHERE
    items.id = $someid
GROUP BY
    items.name,
    items.color;

필요에 따라 필드 목록을 확장하십시오 (이름, 색상 ...).

다른 팁

OP는 거의 제대로되었습니다. GROUP_CONCAT 서브 쿼리에 열을 감싸고 있어야합니다. 완전한 하위 퀘스트 (쉼표가 기본값이기 때문에 분리기를 해산하고 있습니다) :

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

이는 원하는 결과를 얻을 수 있으며 서브 쿼리의 외부 범위 변수에 액세스 할 수 있기 때문에 허용 된 답변이 부분적으로 잘못되었음을 의미합니다.

나는 당신이 "userid = itemid"가 잘못되었을 수 있다고 생각합니다.

SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId) AS IdList
FROM FAVOURITES 
INNER JOIN ITEMS ON (ITEMS.Id = FAVOURITES.ItemId OR FAVOURITES.UserId = ITEMS.Creator)
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID

Group_Concat의 목적은 정확하지만 하위 쿼리는 불필요하고 문제를 일으 킵니다. 대신 시도해보십시오.

SELECT ITEMS.id,GROUP_CONCAT(FAVOURITES.UserId)
FROM FAVOURITES INNER JOIN ITEMS ON ITEMS.Id = FAVOURITES.ItemId
WHERE ITEMS.Id = $someid
GROUP BY ITEMS.ID

예, Soulmerge의 솔루션은 괜찮습니다. 그러나 예를 들어 더 많은 어린이 테이블에서 데이터를 수집 해야하는 쿼리가 필요했습니다.

  • 메인 테이블 : 세션 (프레젠테이션 세션) (uid, name, ..)
  • 첫 번째 자식 테이블 : 이벤트 key session_id (uid, session_uid, date, time_start, time_end)
  • 두 번째 어린이 테이블 : accessories_needed (노트북, 프로젝터, 마이크 등) key session_id (uid, session_uid, accessory_name).
  • 세 번째 어린이 테이블 : Session_Presenters (발표자) key session_id (uid, session_uid, presenter_name, 주소 ...)

모든 세션에는 어린이 테이블 테이블에 더 많은 행이 있습니다 (더 많은 시간 일정, 더 많은 액세서리)

그리고 모든 세션마다 하나의 컬렉션을 수집하여 광석 행 (일부 중 일부)에 표시해야했습니다.

session_id | session_name | date | time_start | time_end | accessories | presenters

내 솔루션 (많은 시간의 실험 후) :

SELECT sessions.uid, sessions.name,
    ,(SELECT GROUP_CONCAT( `events`.date SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS date
    ,(SELECT GROUP_CONCAT( `events`.time_start SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_start
    ,(SELECT GROUP_CONCAT( `events`.time_end SEPARATOR '</li><li>') 
            FROM `events` 
            WHERE `events`.session_id = sessions.uid ORDER BY `events`.date) AS time_end
    ,(SELECT GROUP_CONCAT( accessories.name SEPARATOR '</li><li>') 
            FROM accessories 
            WHERE accessories.session_id = sessions.uid ORDER BY accessories.name) AS accessories
    ,(SELECT GROUP_CONCAT( presenters.name SEPARATOR '</li><li>') 
            FROM presenters
            WHERE presenters.session_id = sessions.uid ORDER BY presenters.name) AS presenters

    FROM sessions

따라서 필요에 따라 가입이나 그룹이 없습니다. 데이터 친화적 인 데이터 친화적 인 또 다른 유용한 사항 ( "에코 잉"할 때) :

  • date, time_start, time_end 등에 이벤트를 포장 할 수 있습니다.u003CUL>u003CLI> ...u003C/LI>u003C/UL> " 그래서 "u003CLI>u003C/LI> "쿼리에서 분리기로 사용하면 목록 항목의 결과가 분리됩니다.

나는 이것이 누군가를 돕기를 바랍니다. 건배!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top