如何在mysql查询

时间:2016-04-29 12:26:41

标签: php mysql

我有两张桌子。

第一个表名'student'包含字段课程,其中包含1,45,89

等值

第二个表名'package'包含字段courseid,其中包含1,5,89

之类的值

我想比较两个字段。我想在这两个领域都有共同的价值观。所以要做到这一点我试过

SELECT 
   s.name, 
   p.name 
FROM 
   student AS s, 
   package AS p 
WHERE 
   find_in_set(s.course, p.courseid)

但是resultset返回0条记录。 任何人都可以帮助我...提前谢谢你

3 个答案:

答案 0 :(得分:1)

find_in_set第一个参数应该只由其中一个数字组成,而不是整数。 因此,您可以选择您感兴趣的所有课程ID,然后检查它们是否存在于学生表和包表中。

但是这种方式不好用的是关系数据库,你应该使用映射表(例如:student_map_course with columns id_student id_course) 你可以为每个学生提供更多的行。

第二件事是,你不能用这种方式选择东西,如果你同时使用这两个表(学生和课程),你必须使用某种JOIN 在创建JOIN时,映射表会再次帮助你(例如student_map_course),所以你可以通过他的id加入学生到他参加的课程..

答案 1 :(得分:0)

我会使用PHP进行比较。

$a = "1,45,89";
$b = "1,5,89";

$a_arr = explode(",", $a);
$b_arr = explode(",", $b);

$values_in_both = array_intersect($a_arr, $b_arr);

var_dump($values_in_both);

您可以使用可能的SQL查询,但我放在一起的查询非常混乱。我结合了两个答案来创建它。

Kickstart' Split string

FBB' Intersect

SELECT temp.a_course_id from (

(SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(student.course, ',', sub0.aNum), ',', -1) AS a_course_id
FROM student
INNER JOIN
(
    SELECT 1 + units.i + tens.i * 10 AS aNum, units.i + tens.i * 10
AS aSubscript
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
) sub0

ON (1 + LENGTH(student.course) - LENGTH(REPLACE(student.course, ',', ''))) >= sub0.aNum
GROUP BY a_course_id)

UNION ALL

(SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(package.courseid, ',', sub0.aNum), ',', -1) AS a_course_id
FROM package
INNER JOIN
(
    SELECT 1 + units.i + tens.i * 10 AS aNum, units.i + tens.i * 10
AS aSubscript
    FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
) sub0

ON (1 + LENGTH(package.courseid) - LENGTH(REPLACE(package.courseid, ',', ''))) >= sub0.aNum
GROUP BY a_course_id))
  AS temp GROUP BY a_course_id HAVING count(*) >= 2

你可以通过保存来自i UNION SELECT 1 ...部分的SELECT 0来减少混乱,尽管我想让事情接近我所提到的答案。

答案 2 :(得分:0)

您的表格结构不标准。尝试规范化你的桌子,这将有很大帮助。对于当前场景:从“student”表中获取数据。然后分开他们和他们使用循环创建动态字符串(如:'package.course_id REGEXP '[[:<:]]".$course_id."[[:>:]]')&amp;使用

foreach($arrCourseid as $courseid)
{
   $str .= strlen($str) > 0 ? ' OR ' : ' and (' ;
   $str .= ' package.course_id REGEXP '[[:<:]]".$course_id."[[:>:]]';

}
$str .= strlen($str) > 0 ? ' ) ' : '' ;

$mainqry = "SELECT s.name, p.name FROM student AS s , package AS p WHERE 1 " . $str ;