我有两张桌子。
第一个表名'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条记录。 任何人都可以帮助我...提前谢谢你
答案 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 ;