2012-03-19 61 views
-1
SELECT 
    lesson_id_1, 
    lesson_id_2, 
    lesson_id_3, 
    lesson_id_4, 
    lesson_id_5, 
    lesson_id_6, 
    lesson_id_7, 
    lesson_id_8, 
    lesson_id_9, 
    lesson_id_10 
FROM hub_attendance 
WHERE 
    student_id='351' AND 
    course_id = '102' AND 
    (
     lesson_id_1 = 300 OR 
     lesson_id_2 = 300 OR 
     lesson_id_3 = 300 OR 
     lesson_id_4 = 300 OR 
     lesson_id_5 = 300 OR 
     lesson_id_6 = 300 OR 
     lesson_id_7 = 300 OR 
     lesson_id_8 = 300 OR 
     lesson_id_9 = 300 OR 
     lesson_id_10 = 300 
    ) 
LIMIT 1 

我知道这不是很漂亮,但这是我的MySQL声明。我正在试图找到lesson_id_xx,它在哪里它= 300.我如何磨合,以便它只返回单一的lesson_id_xx,而不是所有的?如何缩短这条SQL语句?

这是它返回现在:

array(10) { 
    ["lesson_id_1"]=> string(3) "279" 
    ["lesson_id_2"]=> string(3) "292" 
    ["lesson_id_3"]=> string(3) "293" 
    ["lesson_id_4"]=> string(3) "294" 
    ["lesson_id_5"]=> string(3) "295" 
    ["lesson_id_6"]=> string(3) "296" 
    ["lesson_id_7"]=> string(3) "297" 
    ["lesson_id_8"]=> string(3) "298" 
    ["lesson_id_9"]=> string(3) "299" 
    ["lesson_id_10"]=> string(3) "300" 
} 

我只是想这一点:

array(10) { 
    ["lesson_id_10"]=> string(3) "300" 
} 
+2

你有10个lesson_id列? – 2012-03-19 16:43:20

+0

不要问,这只是这张桌子的设置方式。这很可怕我知道 – user1219572 2012-03-19 16:46:12

+0

你是认真的吗?我同意@hakre'“这是拖钓吗?”# – SpYk3HH 2012-03-19 16:46:25

回答

2

没有太大的帮助,但你可以通过使用in缩短where条款:

SELECT 
    lesson_id_1, lesson_id_2, lesson_id_3, lesson_id_4, lesson_id_5, 
    lesson_id_6, lesson_id_7, lesson_id_8, lesson_id_9, lesson_id_10 
FROM hub_attendance 
WHERE 
    student_id='351' AND course_id = '102' AND 
    300 in (lesson_id_1, lesson_id_2, lesson_id_3, lesson_id_4, lesson_id_5, 
      lesson_id_6, lesson_id_7, lesson_id_8, lesson_id_9, lesson_id_10) 
LIMIT 1 

但是,我认为真正的答案是您需要重新设计,也不需要如果您想更容易地查询它,请将此表恶意化。

+0

是的,我打算把这个与开发人员一起讨论。很明显,我以后会遇到更多问题。不敢相信他期待着我能够真正的与之合作。 – user1219572 2012-03-19 16:53:20

0

我不认为你可以做你想做的。一旦你在Select补上一没有办法回来,据我知道:)

PS:你应该realllllllllly重新设计你的数据库和Don”不要让这样的桌子这样...这是冒犯(并会冒犯)很多程序员...

1

我想你是在谈论一个表(hub_attendance),你有很多lesson_id_xx列,代表的课程学生将采取的方式,即对于给定课程,学生可以选择不同的课程选项。这是正确的吗?如果是这样,缩短这个说法正确的方法是根据合适关系的原则重新设计你的表格,让你有两个表:

hub_attendance: 
id, student_id, course_id 

attendance_lesson: 
attendance_id, lesson_id 

这attendance_lesson表连接表代表许多一对多的关系,即一节课可以有很多课程,一门(课程)课程可以有很多课程。然后

您的SQL看起来就像这样(假设你想用300号的教训所有人次):

SELECT * 
    FROM hub_attendance 
WHERE EXISTS(SELECT 1 
       FROM attendance_lesson 
       WHERE attendance_lesson.lesson_id = 300 
       AND attendance_lesson.attendance_id = hub_attendance.id) 
0

显然它应该是像

SELECT a.*,group_concat(lesson_id) FROM hub_attendance a, hub_lessons l 
    WHERE h.id=l.aid AND lesson_id = 300 GROUP BY aid