2014-01-08 60 views
0

我有一個表,所有的用戶標識的是不同的,因爲我需要一個主鍵,但98不同的用戶名的鏈接到一個用戶名。我需要從名爲studenttable的數據庫中選擇一個用戶,但仍然調用userID如何從一個表,其中用戶ID是不同的選擇用戶ID和用戶

這是表中的更短的例如:

**UserID Username Year Form Subject1 Subject2 Subject3 Subject4** 
     1  John  13  D  Art  French Psychology Religion 
     2  John  13  D  Art  French Psychology Religion 
     . 
     . 
     99  Fank  13  D  Maths  Art  Geography Biology 
     100  Fank  13  D  Maths  Art  Geography Biology 
     . 
     . 
     198  Max  12  A  Psychology Maths Physics  German 
     199  Max  12  A  Psychology Maths Physics  German 
     . 
     . 
     296  Henry  13  D  Psychology Economics French P.E 
     297  Henry  13  D  Psychology Economics French P.E 

等....

我想選擇所有從數據庫中符合特定條件的用戶,例如,他們必須在年13形式D和做心理學​​作爲他們的主題之一。然後我只想顯示一個具有相同用戶名的用戶。

我想要的結果表的樣子:

UserID  Username  Year Form Subject 
    1   John   13  D  Psychology 
    296   Henry  13  D  Psychology 

任何幫助,將不勝感激, 感謝

+1

這是jdbc相關還是隻是一個SQL查詢? – PopoFibo

回答

0

的聚合MIN下面是任意的,它將搭載了相同的記錄的最小值。如果需要,可以使用任何其他聚合器,例如MAX

SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4 
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4 
0

我想選擇所有從符合特定 標準,比如,他們必須在今年13和形式d做 心理學​​爲一體的數據庫中的用戶在他們的學科。然後我只想顯示具有相同用戶名的用戶之一 。

所以你要找到這些行形成的表:

SELECT DISTINCT(s.userId) FROM studenttable s 
    WHERE s.year = 13 AND s.form='D' 
     and (s.subject1='Psychology' OR s.subject2='Psychology' 
     OR s.subject3='Psychology' OR s.subject3='Psychology') 

DISTINCT允許在SQL查詢用來從結果集中刪除重複。

+0

你是對的!我修好了它。 – herry

3

表格中的問題是,對象可以是在四列Subject1 Subject2 Subject3 Subject4的任何列,爲此,你可以使用IN謂詞是這樣的:

WHERE 'Psyhcology' IN(Subject1, Subject2, Subject3, Subject4) 

這樣完整的查詢將是:

SELECT 
    UserId, 
    UserName, 
    Year, 
    Form, 
    'Psyhcology' AS Subject 
FROM tablename 
WHERE Year = 13 
    AND Form = 'D' 
    AND userID IN(SELECT UserID 
       FROM tablname 
       WHERE 'Psychology' IN(Subject1, Subject2, Subject3, Subject4)); 

需要注意的是:該查詢會給你複製爲Name行,因爲你必須用不同的ID的多個名稱:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗ 
║ USERID ║ USERNAME ║ YEAR ║ FORM ║ SUBJECT ║ 
╠═════════╬═══════════╬═══════╬═══════╬════════════╣ 
║  1 ║ John  ║ 13 ║ D  ║ Psyhcology ║ 
║  2 ║ John  ║ 13 ║ D  ║ Psyhcology ║ 
║ 296 ║ Henry  ║ 13 ║ D  ║ Psyhcology ║ 
║ 297 ║ Henry  ║ 13 ║ D  ║ Psyhcology ║ 
╚═════════╩═══════════╩═══════╩═══════╩════════════╝ 

但是,如果你想獲得唯一的行,你必須選擇一個ID爲每個組的名稱,例如MIN(USerID)

SELECT 
    MIN(UserId) AS UserId, 
    UserName, 
    Year, 
    Form, 
    'Psyhcology' AS Subject 
FROM users 
WHERE Year = 13 
    AND Form = 'D' 
    AND userID IN(SELECT UserID 
       FROM users 
       WHERE 'Psychology' IN(Subject1, 
         Subject2, 
         Subject3, 
         Subject4)) 
GROUP BY Username, Year, Form, Subject; 

這會給你:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗ 
║ USERID ║ USERNAME ║ YEAR ║ FORM ║ SUBJECT ║ 
╠═════════╬═══════════╬═══════╬═══════╬════════════╣ 
║ 296 ║ Henry  ║ 13 ║ D  ║ Psyhcology ║ 
║  1 ║ John  ║ 13 ║ D  ║ Psyhcology ║ 
╚═════════╩═══════════╩═══════╩═══════╩════════════╝ 

但是,我寧願normalize表代替,通過爲subjects創建一個新表:

Subjects

  • SubjectId PK,
  • SubjectName

那麼你的表格看起來像:

  • UserId
  • UserName
  • Year
  • Form
  • SubjectId一個外鍵引用的對象表。

這樣可以更容易地查詢這兩個表。舉例來說,如果你要搜索誰採取特定主題的用戶,你可以簡單地連接兩個表:

SELECT 
    MIN(u.UserId) AS UserId, 
    u.Username, 
    u.Year, 
    u.Form, 
    s.Subjectname 
FROM users AS u 
INNER JOIN subjects AS s ON u.subjectId = s.subjectId 
WHERE s.subjectname = 'Psyhcology' 
    AND u.Year = 13 
    AND u.Form = 'D' 
GROUP BY u.Username, u.Year, u.Form, s.Subjectname; 

這將給你相同的結果之前:

╔═════════╦═══════════╦═══════╦═══════╦═════════════╗ 
║ USERID ║ USERNAME ║ YEAR ║ FORM ║ SUBJECTNAME ║ 
╠═════════╬═══════════╬═══════╬═══════╬═════════════╣ 
║ 296 ║ Henry  ║ 13 ║ D  ║ Psyhcology ║ 
║  1 ║ John  ║ 13 ║ D  ║ Psyhcology ║ 
╚═════════╩═══════════╩═══════╩═══════╩═════════════╝ 

這裏與修改後的表結構演示:

0

你可以做這樣的事情。

select distinct(UserID), Username, Year, Form, Subject from studenttable where Year = 13 
    and Form = 'D' and userID in(select UserID 
      from studenttable 
      where 'Psychology' in (Subject1, 
        Subject2, 
        Subject3, 
        Subject4)); 
+0

@Mahmoud Gamal爲什麼需要檢查每個主題?我們有三個基本條件,並基於這些數據將從數據庫中提取。 –

+1

Thanks @Mahmoud Gamal編輯了我的答案。 –