2011-08-14 125 views
1

我试图抓住从2桌,一个具有以下结构的结果:具有以下结构MySQL查询问题

CREATE TABLE `users` 
(
    `id` bigint (20) NOT NULL AUTO_INCREMENT , 
    `firstname` varchar (255) NOT NULL, 
    `lastname` varchar (255) NOT NULL, 
    `sex` varchar (255) NOT NULL, 
    `orientation` varchar (50), 
    `email` varchar (255) NOT NULL, 
    `altemail` varchar (255), 
    `username` varchar (255) NOT NULL, 
    `password` varchar (255) NOT NULL, 
    `school` varchar (255) NOT NULL, 
    `age` date NOT NULL, 
    `image1` varchar (255), 
    `image2` varchar (255), 
    `image3` varchar (255), 
    `image4` varchar (255), 
    `image5` varchar (255), 
    `music` longtext, 
    `movies` longtext, 
    `tv` longtext, 
    `books` longtext, 
    `saysomething` longtext, 
    `course` varchar (255), 
    `YEAR` integer (11), 
    `verified` varchar (255), 
    `verifieddatetime` datetime, 
    `string` varchar (255), 
    `alerts` varchar (50), 
    PRIMARY KEY (`id`) 
) 

而且一个:

CREATE TABLE `timetable` 
(
    `id` bigint (20) NOT NULL AUTO_INCREMENT , 
    `studentid` varchar (255), 
    `classno` varchar (50), 
    `classname` varchar (255), 
    `classnumber` varchar (255), 
    `prof` varchar (255), 
    PRIMARY KEY (`id`) 
) 

用户名是存储作为时间表中的外键。每个学生在时间表中输入他们的课程。试图做一个搜索结果,该搜索结果将生成与当前用户在同一所学校的同一班级中的所有人。需要返回users表中的id,firstname,lastname,image1字段以及时间表表的classname,classnumber。我有以下查询来抓取同一学校的用户的结果:

$query = "select users.id, users.firstname, users.lastname, users.age, users.image1, users.school, category.category from users, category where users.image1 !='male.gif' and users.image1 !='female.gif' and users.verified ='yes' and users.username !='$_SESSION[myusername]' and users.school = '$school' and users.school = category.cat_id"; 

但我不知道如何抓取类。任何帮助将不胜感激。谢谢。

回答

0
SELECT 
    users.id, 
    users.firstname, 
    users.lastname, 
    users.age, 
    users.image1, 
    users.school, 
    category.category, 
    timetable.classname, 
    timetable.classnumber 
FROM 
    users 
INNER JOIN 
    category 
ON 
    users.school = category.cat_id 
INNER JOIN 
    timetable 
ON 
    timetable.studentid = users.id 
INNER JOIN 
    (
    SELECT 
    classno 
    FROM 
    timetable 
    WHERE 
    studentid = $id_of_the_user 
) classes_of_the_one_user 
ON 
    classes_of_the_one_user.classno = timetable.classno 
WHERE 
    users.image1 != 'male.gif' 
AND 
    users.image1 != 'female.gif' 
AND 
    users.verified = 'yes' 
AND 
    users.school = '$school' 
1

我不明白表timetable在这个查询中变得有趣 - 它不包括在内。

但无论如何,我有一些设计问题/提示:

  1. timetable.studentid将更好地为bigint (20) NOT NULL
  2. 你应该有一个单独的领域为学生的性别。我想有一张照片显示性别 - male.giffemale.gif?那么,这应该来自性别领域,而不是其他方式。
  3. 根据$_SESSION[myusername]来自哪里,您很容易受到SQL注入的影响。不要忘记使用mysql_real_escape()