2010-08-05 101 views
2

我有一個1275字段寬的MYSQL表。表格中的每一行都代表一個班級的學生,每個學生有17個字段,每個班級X可達75個學生,因此17個X 75 = 1275個字段。使用PHP縮短重複的1400行MySQL UNION查詢

我設計了一個SQL UNION查詢,成功地將學生拉入另一個表,每個學生在一行上。

現在,我想使用這個UNION查詢作爲PHP程序的一部分。我已經將查詢「導入」到PHP中了。但是,沒有辦法使用PHP來縮短SQL查詢嗎?無恥的,這是我的代碼:

$sql = " 
    INSERT INTO $t_mem2 
    SELECT localcourse 
     , statecourse 
     , coursetitle 
     , semester 
     , section 
     , teachercode 
     , teachername 
     , meetingcode 
     , classpop 
     , student_id_01 AS student_id 
     ,  sex_01 AS sex 
     ,  dob_01 AS dob 
     ,  grade_01 AS grade 
     ,  ethnic_01 AS ethnic 
     , last_name_01 AS last_name 
     , first_name_01 AS first_name 
     , $c_sch  AS sch_code 
    FROM $t_mem1 
    UNION 
    SELECT localcourse 
     , statecourse 
     , coursetitle 
     , semester 
     , section 
     , teachercode 
     , teachername 
     , meetingcode 
     , classpop 
     , student_id_02 AS student_id 
     ,  sex_02 AS sex 
     ,  dob_02 AS dob 
     ,  grade_02 AS grade 
     ,  ethnic_02 AS ethnic 
     , last_name_02 AS last_name 
     , first_name_02 AS first_name 
     , $c_sch  AS sch_code 
    FROM $t_mem1 
    UNION 
    SELECT localcourse 
     , statecourse 
     , coursetitle 
<...snip..............................> 
    , teachername 
    , meetingcode 
    , classpop 
    , student_id_75 AS student_id 
    ,  sex_75 AS sex 
    ,  dob_75 AS dob 
    ,  grade_75 AS grade 
    ,  ethnic_75 AS ethnic 
    , last_name_75 AS last_name 
    , first_name_75 AS first_name 
    , $c_sch  AS sch_code 
    FROM $t_mem1 
ORDER 
    BY localcourse 
    , statecourse 
    , semester 
    , section 
    , teachername 
    , meetingcode 
    , last_name 
    , first_name" ; 
+6

如果規範化數據庫,事情會縮短。 – 2010-08-05 01:28:35

+1

由於沒有按照預期的方式使用關係數據庫,使得你的生活更加艱難,也就是使用表之間的關係有效地維護數據。尋求正常化,併爲自己節約數小時的未來頭痛。 – Tahbaza 2010-08-05 01:30:19

+0

但是1275列表是在這個項目中給出的,而不是一個選項。我沒有擺桌子。你是這個意思嗎? – dave 2010-08-05 01:35:05

回答

3

首先更換01 .. 75,這個查詢表明你的數據庫架構是非常非常差。

這且不說,是的,你可以縮短與PHP查詢:

$query = "INSERT INTO $t_mem2 "; 
for ($i = 1; $i <= 75; $i++) { 
    if ($i > 1) { 
     $query .= ' UNION '; 
    } 
    $s = "$i"; 
    if ($i < 10) { 
     $s = '0'.$s; 
    } 
    $query .= "SELECT localcourse 
     , statecourse 
     , coursetitle 
     , semester 
     , section 
     , teachercode 
     , teachername 
     , meetingcode 
     , classpop 
     , student_id_{$s} AS student_id 
     ,  sex_{$s} AS sex 
     ,  dob_{$s} AS dob 
     ,  grade_{$s} AS grade 
     ,  ethnic_{$s} AS ethnic 
     , last_name_{$s} AS last_name 
     , first_name_{$s} AS first_name 
     , $c_sch  AS sch_code FROM $t_mem1"; 
} 
$query .= " ORDER 
BY localcourse 
, statecourse 
, semester 
, section 
, teachername 
, meetingcode 
, last_name 
, first_name" ; 

這會「縮短查詢」由PHP代碼生成它。另一方面,如果您希望查詢,因爲它會縮短數據庫,這也是可能的;只需修改上面的循環,在每次迭代中重新開始$query,並將所有結果一起放入一個數組中。您最終將完成75個查詢,PHP將執行UNION。

+0

而不是使用if語句作爲'$ i <10',它可能會更清晰地使用'sprintf'或'str_pad'。另外,將所有內容添加到數組中並使用'implode'可能會使代碼更容易閱讀:) +1 btw – Wolph 2010-08-05 01:54:14

+0

謝謝Borealid。這非常快,我將實施您的解決方案。這個「寬」表是由州政府機構下載的。如果你想要一所學校的孩子,這就是你得到的。期。 :-) – dave 2010-08-05 02:04:27

+0

@WoLpH:你說的都對。我的第一個想法就是,這很簡單,你可以做一個容易理解的'$ i <10'塊。我認爲我沒有使用'implode'的原因是因爲我已經將查詢從1400行降到20:-P。 – Borealid 2010-08-05 02:13:57

2

我打電話給WoLpH的OMG,然後提出一個WTF。

爲了更多地解釋「正常化」的含義,您希望在這裏至少有兩個表格:一個用於課程,一個用於學生(可能還有一個用於教師)。所有與一些領域進入students表,teachernameteachercode(可能帶有id)進入teachers表,一切進入courses表,有一些新的領域一起:teacher_id(或teachercode)和student_id,和最好是它自己的AUTOINCREMENT ed id。然後,當你想獲得類似的70KB查詢的結果,你這樣做:

SELECT C.id AS course_id 
    , C.localcourse 
    , C.statecourse 
    , C.coursetitle 
    , C.semester 
    , C.section 
    , T.teachercode 
    , T.teachername 
    , C.meetingcode 
    , C.classpop 
    , C.student_id 
    , S.sex 
    , S.dob 
    , S.grade 
    , S.ethnic 
    , S.last_name 
    , S.first_name 
FROM courses C 
JOIN students S ON C.student_id = S.id 
JOIN teachers T ON C.teacher_id = T.id 

而且,你也許並不需要classpop,你可以用SELECT COUNT(C.student_id) AS classpop ... GROUP BY C.id得到它。

+0

謝謝。我需要更加熟悉正常化。沒有任何藉口,除了在我的工作中,我可以使用一張表來獲得某些數據,解決一個小問題,然後我可能永遠不會再使用這張表。所以,我所做的任何事情都沒有甚麼永久性。 – dave 2010-08-05 02:11:05