【问题标题】:MySQL Query and Checkbox ApproachMySQL 查询和复选框方法
【发布时间】:2013-02-25 07:38:17
【问题描述】:

我的桌子:

pno     name         lesson
-----------------------------
1       John         Math
1       John         Biology
2       Lisa         Biology
3       Emma         Math
3       Emma         Art
3       Emma         Pyhsic

您可以将课程视为“复选框”,当用户检查课程时,它会过滤我的表格。 问题就在这里,我想过滤只选数学和生物学!


当用户只检查数学时;

我的过滤表:

pno     name         lesson
-----------------------------
1       John         Math
3       Emma         Math

当用户同时选中数学和生物学时;

我的过滤表:

pno     name         lesson
-----------------------------
1       John         Math
1       John         Biology

我的 HTML 设计是http://jsbin.com/adarih/2/

当用户检查数学和生物学时,我标记了石灰色。所以丽莎有生物学但没有数学。我不带丽莎。艾玛选修数学,但不选生物。我不带艾玛。

其实看起来很简单。但这对我来说是至关重要的 sql 查询...

【问题讨论】:

  • 能否说得更清楚些?
  • 您的问题不清楚。也许展示一些示例代码以及预期和实际结果可能会有所帮助。
  • 我不喜欢 OP 问问题然后不回答那些想要帮助他的人
  • 抱歉回答迟了。对我来说很清楚...... @mjshaw 这只是查询。当我解决问题时,我会纠正代码。

标签: mysql sql join filter


【解决方案1】:

我不能 100% 确定您想要返回什么结果,但您可以通过如下查询获得具有数学和生物学的每个结果的不同 pno 和名称:

SELECT DISTINCT Table1.pno, Table1.name
FROM SomeTable Table1
  INNER JOIN SomeTable Table2 ON Table2.pno = Table1.pno AND Table2.lesson = 'Biology'
WHERE Table1.lesson = 'Math'
ORDER BY Table1.pno

对于支持任意数量匹配的更灵活的查询,假设您只有一种课程类型(您可能希望在 pno 和课程上执行唯一键以保证这一点),您可以执行以下操作:

SELECT pno, name
FROM SomeTable
WHERE lesson IN ({Match List})
GROUP BY pno, name
HAVING COUNT(1) = {Total Number of options}
ORDER BY pno

其中 {Match List} 是您的列表(例如原始问题中的“数学”、“生物学”),其中 {Total Number of options} 等于所有必须匹配的唯一值的数量( 2 在这种情况下)。再次强调,这只有在每个 pno 的每节课都是独一无二的情况下才有效……如果不是,你就会得到误报。

【讨论】:

    【解决方案2】:

    你可能会找这个

    $sql="select * from your_table 
    where lesson =  '$biology'";
                          ^^-------this is the variable of which they select from check box
    

    当他们选择另一个复选框时

    你可以添加这个

    $sql .= "OR lesson= '$math' " ;
    

    【讨论】:

    • 那行不通,因为课程永远不会同时是“生物学”和“数学”
    • Problem is here that I want to filter Only taking BOTH Math AND Biology!
    • 这将在表格中的两个单独条目中!
    • 首先,OP 根本没有指定 PHP。只是 MySQL。其次,“select * from your_table where course = 'Biology' AND course = 'Math'”的查询将总是返回 0 个结果,因为课程不能同时是两者。我认为您的意思是在其中有一个 OR,然后在 PHP 中将结果构建到数据数组中并针对计数等进行测试以查看两者是否正确?
    【解决方案3】:

    如果您想要同时学习数学和生物的人的列表,这应该可以:

    SELECT t1.pno, t1.name
    FROM myTable t1
    WHERE EXISTS
    (
    SELECT 1
    FROM myTable t2
    WHERE t1.pno = t2.pno
    AND t2.lesson = 'Math'
    )
    AND EXISTS
    (
    SELECT 1
    FROM myTable t3
    WHERE t1.pno = t3.pno
    AND t3.lesson = 'Biology'
    )
    

    【讨论】:

    • 它适用于数学和生物学。但是用户只检查了数学,当我删除最后一个“并且存在”块时它不起作用。
    猜你喜欢
    • 2012-11-25
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2016-05-17
    相关资源
    最近更新 更多