Php Mysql选择不存在的地方

Php Mysql选择不存在的地方,php,mysql,Php,Mysql,我有以下表格: 表名::学生 studentid studentname 1001 Charlie Sheen 1002 John Cryer 表名::studentpayment1 paymentid studentid fee_month fee_year totalamount 1234 1001 February 2012 $500 4321 1002

我有以下表格:

表名::学生

studentid     studentname
1001          Charlie Sheen
1002          John Cryer
表名::studentpayment1

paymentid  studentid    fee_month  fee_year  totalamount
  1234          1001     February    2012        $500
  4321          1002     January     2012       $1500
表名::studentpayment2

 id          pid        fee_type        fee_amount
 1          1234        Monthly Fee           $500
 2          4321        Exam Fee             $1500      
现在,我正试图找出那些没有支付2012年2月“月费”的学生的名字

我尝试了以下代码,但它没有生成正确的信息

$year="2012"; $month="February"; $fee_type="Monthly Fee";


SELECT DISTINCT studentid,
                studentname
FROM   student
WHERE  NOT EXISTS (SELECT   *
                   FROM     studentpayment1
                     JOIN   studentpayment2
                     ON     studentpayment1.paymentid = studentpayment2.pid
                   WHERE    fee_month = '$month'
                     AND    fee_type = '$fee_type'
                     AND    fee_year = '$year'
                     AND    student.studentid = studentpayment1.studentid)
LIMIT  $perPage

如何修复此查询?

您的变量不应包含在单引号内:

"WHERE    fee_month = '".$month."' "
最好是绑定变量


这里关于绑定的讨论:

我还没有尝试实时运行此查询,但这应该会对您有所帮助

select distinct studentid from student where studentid NOT EXISTS (select studentid from studentpayment1 where  fee_month = '$month'
                     AND    fee_type = '$fee_type'
                     AND    fee_year = '$year')


如果您的子查询是正确的(我还没有看它),下面的查询应该可以工作

SELECT DISTINCT studentid,studentname FROM student WHERE
studentid NOT IN (SELECT studentid FROM studentpayment1 JOIN studentpayment2 ON studentpayment1.paymentid=studentpayment2.pid WHERE 
fee_month='$month' AND fee_type='$fee_type' AND fee_year='$year' AND student.studentid=studentpayment1.studentid ) LIMIT $perPage

尝试改用左连接:

SELECT student.studentid, student.studentname FROM student
LEFT JOIN studentpayment1 ON studentpayment1.studentid = student.studentid
  AND studentpayment1.fee_month = ?
  AND studentpayment1.fee_year  = ?
LEFT JOIN studentpayment2 ON studentpayment2.pid = studentpayment1.paymentid
  AND studentpayment2.fee_type = ?
WHERE studentpayment2.id IS NULL

确保将索引放在费用月、费用年和费用类型上,然后全部替换?使用您的变量。

看起来这样做可以:

$year="2012"; $month="February"; $fee_type="Monthly Fee";

$students_with_debt = "SELECT name FROM student WHERE studentid NOT IN (SELECT studentid FROM studentpayment1 p1 INNER JOIN studentpayment2 p2 ON p1.paymentid = p2.pid WHERE fee_month = '$month' AND p1.fee_year = '$year' AND p2.fee_type = '$fee_type');"

这将给你所有的学生谁从来没有支付,在2012年2月没有,或在2012年2月没有月费

SELECT * FROM student s 
   LEFT JOIN studentpayment1 sp1 
      ON s.studentid = sp1.studentid 
        AND ((sp1.fee_month = 'February' AND sp1.fee_year = '2012') OR sp1.fee_month is null)
   LEFT JOIN studentpayment2 sp2 
      ON sp1.paymentid = sp2.pid AND ( sp2.fee_type  = 'Monthly Fee' OR  sp2.fee_type is null)
   WHERE sp1.fee_month is null or sp2.fee_type is null
祝你好运


顺便说一句,这里有一些很好的模式建议:将选项卡上的所有主键更改为“id”,并与外键的命名保持一致:studentpayment1表中studentpayment2表的主键应为“id”,它应该有一个名为student\u id的列。studentpayment2表应该有一个指向studentpayment1调用的studentpayment1\u id不是“pid”

OP可能需要绑定变量的示例。@请尝试以下查询:
从studentname、studentpayment1、studentpayment2中选择studentname,其中student.studentid=studentpayment1.studentid和pid=paymentid和费用类型!=“月费”和“2012年费用”以及“2月费用”
OP可能希望解释一下为什么这种方法在最初失败的情况下有效。以及添加索引的优点/缺点。谢谢您的回复。我尝试了这里发布的所有解决方案,但没有一个有效。但是在连续12个小时的工作之后,我发现我的db查询还可以,我在mysql查询上面的一些代码上遇到了一些问题。很抱歉创建此帖子。我应该删除这个帖子吗?
SELECT * FROM student s 
   LEFT JOIN studentpayment1 sp1 
      ON s.studentid = sp1.studentid 
        AND ((sp1.fee_month = 'February' AND sp1.fee_year = '2012') OR sp1.fee_month is null)
   LEFT JOIN studentpayment2 sp2 
      ON sp1.paymentid = sp2.pid AND ( sp2.fee_type  = 'Monthly Fee' OR  sp2.fee_type is null)
   WHERE sp1.fee_month is null or sp2.fee_type is null