PHP PDO ปล่อยให้เข้าร่วมตารางโดยที่เขตข้อมูลไม่ตรงกัน

ฉันกำลังสร้างแบบทดสอบสำหรับลูกค้าที่ต้องการให้บันทึกผลลัพธ์แบบทดสอบอัตโนมัติ และฉันพบปัญหา ฉันกำลังพยายามเลือกคำถามทั้งหมดที่ผู้ใช้ยังไม่ได้ตอบในแบบทดสอบบางข้อ ฉัน บันทึกผลลัพธ์ของคำถามแต่ละข้อที่ถูกตอบลงในตาราง RESULTS แต่คำสั่งของฉันกำลังยุ่งเหยิงเมื่อมีผู้ใช้มากกว่าหนึ่งคนมีผลในตาราง RESULTS ถ้าใครสามารถดูรหัสของฉันและให้คำแนะนำกับฉันได้ มันจะมาก ชื่นชม ขอบคุณล่วงหน้า!

จากตารางเหล่านี้และคำสั่ง คำถามถัดไปที่ฉันต้องโหลดคือ que_id = 3 สำหรับ use_id = 1 แต่ปัญหาที่ฉันกำลังเผชิญคือส่งคืน que_id = 1 และ que_id = 3 เนื่องจากผู้ใช้ use_id = 2 และ use_id 3 ตอบแล้ว ขอบคุณอีกครั้ง!

ตารางคำถาม

que_id qui_id que_question que_ans_id
1      1      lorem 1?     1
2      1      lorem 2?     6
3      1      lorem 3?     12

ตารางผลลัพธ์

res_id res_use_id res_qui_id res_que_id res_ans_id
1      1          1          1          2
2      1          1          2          6
3      2          1          3          10
4      3          1          1          1

พีเอชพี

$statement_question = $db->prepare("SELECT * FROM roa_quiz
                                    LEFT JOIN roa_questions ON qui_id = que_qui_id
                                    LEFT JOIN roa_results ON que_id = res_que_id
                                    WHERE qui_id = :qui_id AND res_use_id != :use_id");

$statement_question->setFetchMode(PDO::FETCH_ASSOC); 

$statement_question->execute(array(':qui_id' => 1, ':use_id' => 1));

$question = $statement_question->fetch();

person Mitchell Layzell    schedule 29.06.2013    source แหล่งที่มา


คำตอบ (2)


คุณกำลังพยายามรับแถวที่ไม่ ไม่ ตรงกัน แนวคิดคือการใช้ left outer join เพื่อรับแถวที่ตรงกัน . . แล้วตรวจดูว่าไม่มีแมตช์ตรงไหน สิ่งนี้ต้องการสองสิ่ง: (1) ย้ายเงื่อนไขไปยังส่วนคำสั่ง on และ (2) ตรวจสอบว่าไม่ตรงกันในส่วนคำสั่ง where:

SELECT *
FROM roa_quiz LEFT JOIN
     roa_questions
     ON qui_id = que_qui_id LEFT JOIN
     roa_results
     ON que_id = res_que_id and res_use_id = :use_id
where qui_id = :qui_id AND results.res_que_id is null
person Gordon Linoff    schedule 29.06.2013
comment
ขอบคุณมาก มีเหตุผล! - person Mitchell Layzell; 30.06.2013

ฉันจะไปกับ sql:

SELECT * FROM roa_quiz
JOIN roa_questions ON qui_id = que_qui_id
LEFT JOIN roa_results ON que_id = res_que_id AND res_use_id = :use_id
WHERE qui_id = :qui_id
AND res_id IS NULL

นั่นน่าจะทำให้คุณได้รับรายการคำถามที่ยังไม่ได้ตอบสำหรับผู้ใช้แบบทดสอบ ดูที่นี่เพื่อดูไดอะแกรมที่มีประโยชน์บางส่วน sql เข้าร่วม ในกรณีนี้ เราจำเป็นต้องมีการรวมภายนอกด้านซ้าย โดยมีการยกเว้น

person WayneC    schedule 29.06.2013