2013-07-06 6 views
0

복잡한 내부 조인 SQL 요청이 있습니다. 머리를 감쌀 수 없습니다. 누군가 나를 도울 수 있기를 바랬습니다. 3 개의 테이블을 포함하므로 2 개의 내부 조인이 있습니다.복잡한 내부 조인 SQL 요청

내 데이터베이스에는 "users", "statement", "opinion"테이블이 있습니다.

사용자는 진술 및 의견을 작성할 수 있습니다. 의견에는 표현하는 사용자의 ID를 참조하는 "authorid"변수가 있으며 참조하는 문을 참조하는 "statementid"변수가 있습니다.

2 개의 진술이 주어지면 두 진술에 대한 의견을 작성한 사용자 목록을 반환 할 수있는 요청을 제출하려고합니다.

나는

$sid1=5; 
$sid2=6; 
$sql = " 
     SELECT user.* 
     FROM users 
     INNER JOIN opinion 
     ON opinion.authorid=user.uid 
     WHERE opinion.statementid= [sid1? how can i use both] 
     INNER JOIN statement 
     ON statment.uid=opinion.statementid 
     "; 

같은 것을 생각하고 있어요 그러나 당신이 볼 수 있듯이 나는 붙어입니다. UNION이 필요한가요? 추가 설명이 필요한 경우 알려 주시기 바랍니다.

미리 감사드립니다.

편집 : 나는 그것을 할 방법을 생각은 :

SELECT DISTINCT users.uid 
FROM users 
JOIN opinion o, opinion o2 
WHERE users.uid = o.authorid 
AND users.uid = o2.authorid 
AND o2.statementid = $sid2 
AND o.statementid = $sid1 
+0

SELECT ... JOIN..ON ... JOIN ... ON ... WHERE ... IN (...) ... GROUP BY ... HAVING COUNT (*) =. .. – Strawberry

답변

0
SELECT DISTINCT users.uid 
FROM users 
JOIN opinion o, opinion o2 
WHERE users.uid = o.authorid 
AND users.uid = o2.authorid 
AND o2.statementid = $sid2 
AND o.statementid = $sid1 
0

당신은 두 번에 연결 할 수 있어야한다.

SELECT user.* 
FROM users u. opinion o1, statement s1 
    , opinion o2, statement s2 
WHERE o1.authorid=user.uid 
AND o2.authorid = user.uid 
AND o1.statement_id = s1.sid 
AND o2.statementid = s2.sid 
AND s1.sid = $sid1 
AND s2.sid = $sid2 
+0

나는 일할 수 없었다. 또한 s1.sid 및 s2.sid (문에는 sid가 아닌 uid가 있음)가 수정되었습니다. 이 솔루션은 나에게 가장 이해하기 쉽게 보입니다. 나는 그것이 효과가 있었으면 좋겠다. – george

1
SELECT DISTINCT user.* 
    FROM opinion o 
    JOIN usrs u 
     ON u.uid = o.author_id 
     AND o.statement_id = $sid1 
    INTERSECT 
    SELECT DISTINCT user.* 
    FROM opinion o 
    JOIN usrs u 
     ON u.uid = o.author_id 
     AND o.statement_id = $sid2 

이 SQL 언어에서 사용할 수 INTERSECT이 없으십니까? 데이터 구조의

SELECT u.* 
    from opinion o join 
     users u 
     on o.authorid = u.uid join 
     statement s 
     on o.statementid = s.sid 
    where s.sid in (<list of statement ids>); 

귀하의 설명을 조금 혼란 :

SELECT A.* FROM (
    SELECT DISTINCT user.* 
    FROM opinion o 
    JOIN usrs u 
     ON u.uid = o.author_id 
     AND o.statement_id = $sid1 
) A 
JOIN (
    SELECT DISTINCT user.* 
    FROM opinion o 
    JOIN usrs u 
     ON u.uid = o.author_id 
     AND o.statement_id = $sid2 
) B on A.uid = B.uid 
+0

필자는 author_id를 authorid로 변경하고, statement_id를 statementid로 변경하고, usrs를 사용자에게 변경하는 등 구문을 수정 한 후에도 이들 중 하나를 얻을 수 없었다. 내가 뭘 잘못하고 있니? 나는 어리석은 실수를 저 지르지 않으면 안된다고 느낀다 .... – george

+0

@George : 오류에 대한 자세한 내용과 타자를 덜 피하는 것이 유용 할 것이다. –

+0

나는 타이핑을 신경 끄는 것이 아니다. 나는 그것이 작동하지 않는 이유는 변수의 철자 오류 때문이 아니라는 것을 지적하려고하고있다. 나는 PHP를 사용하고 있기 때문에 오류 메시지를받는 방법을 모르며 SQL 쿼리가 작동하지 않을 때 실행되지 않습니다. – george

0

나는이 당신이 원하는 쿼리라고 생각합니다. 그러나 나는 opinion이 저자와 진술을 갖는 것이 핵심 관계임을 추측하고있다. 그리고 statement에는 그것에 관련된 별도의 사용자 ID가 없다.

+0

문에는 연관된 사용자 ID가 있지만 명령문을 작성한 사용자입니다. – george

+0

나는 s.id를 s.uid (문장은 uid, sid가 아님)로 바꾸어도 작동하지 않을 수있다. – george

+0

사실 나는 그저 작동하도록 만들었지 만, 내가 생각한 대답을 만들어 내는지 확신 할 수 없습니다 ... – george