2010-11-15 42 views
2

對不清楚的標題感到抱歉,但我不能提出任何更好的。如何通過MySQL中的外鍵鏈接檢索某些值?

我的困境是:

我在我的數據庫中的一個InnoDB表名爲 「會議」 具有以下結構:

  • MEETING_ID(主鍵,AUTO_INCREMENT)
  • user1_id(外鍵指向一個名爲「users」的表中的user_id)
  • user2_id(外鍵指向一個名爲「users」的表中的user_id)
  • time(type DATETIME)
  • 位置(類型VARCHAR(200))

表 「用戶」 是基本的和看起來像這樣:

  • USER_ID(主鍵,AUTO_INCREMENT)
  • first_name的(類型VARCHAR( 30))
  • 姓氏(類型VARCHAR(30))

我與目的PHP文件簡單地首席T出了會議,例如:的描述

你救了以下會議信息:

用戶1 |用戶2 |時間&日期|會議地點

John Doe | Jane Doe | 2010-10-10 10:10:10 |紐約

現在,我只想使用會議ID,調用我的數據庫(只有「會議」表),並能夠獲得user1和user2的first_name和last_name。

現在,我不工作的代碼如下所示:

$query = "SELECT * FROM meetings WHERE meeting_id = " . $mid; 
$data = mysqli_query($dbc, $query); 
$row = mysqli_fetch_array($data); // ANY CHANGES HERE? 

... 

echo '<p>You saved the following meeting information::</p>'; 
echo '<table>'; 
echo '<tr><th>User 1</th><th>User 2</th><th>Time & Date</th><th>Meeting location</th></tr>'; 
echo '<td>' . $row['user1_id']['first_name'] . ' ' . $row['user1_id']['last_name'] . '</td>'; // NON-WORKING 
echo '<td>' . $row['user2_id']['first_name'] . ' ' . $row['user2_id']['last_name'] . '</td>'; // NON-WORKING 
echo '<td>' . $row['date_time'] . '</td>'; 
echo '<td>' . $row['location'] . '</td>';  
echo '</table>'; 
... 

(如何)我可以檢索未做單獨調用到「用戶」表中的FIRST_NAME /姓氏鏈接?當我檢查phpMyAdmin時,InnoDB外鍵鏈接似乎工作正常。提前謝謝了!

回答

3

如果您的查詢將

$query = "SELECT time, location, user1.first_name, user1.last_name, user2.first_name, user2.last_name FROM meetings m JOIN users user1 ON m.user1_id = user1.id JOIN users user2 ON m.user2_id = user2.id WHERE meeting_id = " . $mid; 

然後名稱應爲

$row['user1.first_name'] 

等等。 外鍵不是總是帶來相關記錄的魔法設備(它們也不應該是)。

編輯:
作爲一個側面說明 - 以數字如user1_iduser2_id末端具有柱通常在誰瞭解規範化和數據庫設計的人心中升起一面紅旗。基本上歸結爲這個問題 - 你是否準備好接受你的會議只支持兩個人和兩個人之間的會議?你應該回答的另一個問題是:你確定你想區分會議的'第一'和'第二'參與者嗎? (目前的設計將使其難以回答的問題,如 - 列出所有的會議,$user與當前表的佈局,你將不得不分別測試這兩個領域,這可能會影響性能)

+0

非常感謝精細查詢,它確實有幫助。關於你對數據庫設計的其他評論,不要擔心:在我的例子中,我的名字只是'簡化'的變量名,我的數據庫看起來並不像這樣。 :)不過,再次感謝! – BeeDog 2010-11-16 08:19:00

+0

我現在在腳本中使用$ row ['userX.first_name'],但它根本不起作用。這裏是我的查詢字符串(用userX取代醫生/病人'更好'的抽象): --- $ query =「SELECT patient.first_name,patient.last_name,doctor.first_name,doctor.last_name,appointmentments.date_time,appointment .description從約會JOIN用戶患者ON約會.patient_app_id = patient.user_id加入用戶醫生ON約會.doctor_app_id = doctor.user_id WHERE約會ID =「。 $援助; --- echo'​​'。 $ row ['patient.first_name']。 ''。 $ row ['patient.last_name']。 ''; – BeeDog 2010-11-16 09:30:46

+1

看上去'SELECT time,location,user1.first_name AS user1_first_name ...'更安全,後來引用爲'$ row ['user1_first_name']'或在您的病例中,等等...... – Unreason 2010-11-16 10:18:46

1

那麼,你必須利用用戶表來從中獲取數據。這是特有的。但是,你只能有一個查詢,這是我認爲你是後:

SELECT u1.first_name, u1.last_name, u2.first_name, u2.last_name, m.time, m.location from meetings m inner join users u1 on m.user_id1 = u1.user_id inner join users u2 on m.user_id2 = u2.user_id 
1

MySQL docs

SQL中的外鍵用於檢查 和強制引用完整性,而不是 來加入表格。如果你想從 SELECT語句獲取多個表 結果,您可以通過 爲此進行它們之間的連接:

SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id; 
1

你不能,只有user1_id包含單個數字,您必須查詢用戶表以獲取該信息。幸運的是,它可以通過連接獲得:

SELECT u1.first_name, u1.last_name, u2.first_name, u2.last_name,meetings.time, meetings.location FROM meetings 
JOIN users u1 ON meetings.user1_id=u1.user_id 
JOIN users u2 ON meetings.user2_id=u2.user_id 
WHERE meeting_id = 
+0

很好的例子!但只是一個後續問題;之後我如何迴應u1的名字和姓氏?我嘗試過: echo'​​'。 $ row ['u1.first_name']]。 ''。 '$ row ['u1.last_name']]。 ''; 但它不會工作。我嘗試了不同的變化,但我無法弄清楚。如果我刪除了「u1」。部分在上面的回聲中,我可以打印出u1名稱,但由於顯而易見的原因,我無法使用它打印出u2,因爲無法區分用戶u1和u2。 – BeeDog 2010-11-16 08:58:36

+1

最後一次我檢查你可以按照你描述的方式來做,但你也可以說'SELECT u1.first_name AS u1fn'然後調用'$ row ['u1fn']',這不是一個好方法這樣做,也許你可以做一個循環來顯示'$ row'和它們的鍵的所有內容......'foreach($ row as $ key => $ value)''然後找出合適的鍵是什麼樣的。也許'$ row ['u1'] ['first_name']'idk我大部分時間都是通過框架從PHP中抽象出SQL。 – 2010-11-16 09:16:02

+0

是的,我會同意這不是最好的方法,但至少它工作。謝謝!我仍然困惑於爲什麼我無法獲得常規的userX.first_name方法來工作... – BeeDog 2010-11-16 10:28:48

相關問題