2012-04-03 16 views
-2

我是MySQL和PHP的新手。我有兩個表,一個容納所有公司名稱和其他表只有用戶低於公司名稱:我需要創建一個查詢使用MySQL和PHP來獲得兩個表的結果

Table 1 
| # | Company name | 
-------------------- 
| 1 | Microsoft | 
| 2 | HP   | 
| 3 | Asus   | 
| 4 | Apple  | 
| 5 | Amazon  | 
| 6 | CCN   | 

table 2 
| # | Company name | User name | 
-------------------------------- 
| 1 | Asus   | x1  | 
| 2 | Apple  | x1  | 
| 3 | HP   | x2  | 
| 4 | Asus   | x2  | 
| 5 | Apple  | x2  | 

我需要創建一個能夠獲得以下的查詢。首先顯示哪些公司與特定用戶相關聯(例如用戶x1的Asus和Apple)。之後,顯示錶1中的其餘公司。

例如,我在尋找的查詢,用戶X1的結果會以這種方式顯示這些行:

| # | Company name | 
-------------------- 
| 1 | Asus   | 
| 2 | Apple  | 
| 3 | Microsoft | 
| 4 | HP   | 
| 5 | Amazon  | 
| 6 | CCN   | 

我怎樣才能做到這一點?

+1

表2應該使用表1中的公司ID,而不是重複的名稱。 – 2012-04-03 20:46:02

+3

我無法理解這個問題。 – jordanm 2012-04-03 20:46:32

+0

使用內連接! – 2012-04-03 20:46:48

回答

2

它看起來像您要包括所有的公司,但是對於給定用戶,列表首先與該用戶關聯的公司。如果是這種情況,你不想使用INNER JOIN

這裏有一些SQL應該工作。我提供了合理的表格和字段名稱,因爲您沒有提供這些名稱。我還假設你有一個沒有重複行的合理理智的表格設計。

SELECT c.company_name, 

    CASE 
    WHEN u.company_name IS NULL THEN 'N' 
    ELSE 'Y' 
    END AS user_has_company 

FROM companies c 

LEFT JOIN (
    SELECT * 
    FROM users 
    WHERE user_name = 'x1' 
) u 
ON u.company_name = c.company_name 

ORDER BY user_has_company DESC, c.company_name 

該查詢將返回一個額外的列 - user_has_company。我會用它來表示當前用戶是否與某個給定的公司相關聯,但是如果您願意,您可以忽略它。

+0

非常感謝您的幫助,我很快就會嘗試 – tony 2012-04-04 13:58:54

+0

您好先生我還有一些小姐對代碼的理解可以再次幫助我,謝謝我的第一個表格調用table1有1現場呼叫company_name第二個表呼叫table2有2現場調用company_name和user_name所以我沒有得到用戶和公司來自哪裏我需要創建它們是用戶是一個新表再次感謝 – tony 2012-04-04 14:29:11

+0

它工作完美謝謝 – tony 2012-04-04 18:02:24

0

您需要連接語句加入另一個table1中的select語句

簡單的例子:

SELECT * FROM表2 INNER JOIN table1.id = table2.id WHERE table2.username =' x1'

在JOIN文檔中可以找到所需的所有東西。 http://dev.mysql.com/doc/refman/5.1/en/left-join-optimization.html

+0

雖然這看起來像是一個理智的解決方案,但它不會根據顯示的輸入產生他的預期輸出。 – jordanm 2012-04-03 20:48:48

+0

這只是一個簡單的例子,而不是他完美的解決方案,你只能通過編程好友學習編程。 – peipst9lker 2012-04-03 20:57:19

+0

非常感謝幫助 – tony 2012-04-04 13:59:55

0

創建查詢是這樣的:

$sql = "SELECT b.companyName FROM table1 a INNER JOIN table2 b ON a.companyName = b.companyName WHERE b.userName = 'x1'"; 

然後,使用PHP,用途:

$con = mysql_connect("localhost","peter","abc123"); 
if (!$con) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 

mysql_select_db("my_db", $con); 

$result = mysql_query($sql); 

while($row = mysql_fetch_array($result)) 
{ 
    echo $row['companyName']; 
    echo "<br />"; 
} 

mysql_close($con); 
+0

非常感謝幫助 – tony 2012-04-04 14:01:32

0

嘗試此查詢:

SELECT company_name FROM table2 ORDER BY user_name ASC 

HTML表,使用PHP代碼:如果你只是後MySQL查詢此則像這樣的工作

$result = mysql_query(" SELECT company_name, user_name FROM table2 ORDER BY user_name ASC"); 
echo "<table> 
     <tr><th>Company Name</th><th>username</th></tr>"; 
while($row = mysql_fetch_array($result) { 
    echo "<tr><td>{$row['company_name']}</td><td>{$row['user_name']}</td></tr>"; 
} 
echo "</table>" 
0

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering 
FROM `table2` 
GROUP BY company_name 
ORDER BY ordering DESC 

但是你應該在你去畝之前看看你的模式進一步。如果在一個表中引用另一個表的列(company_name),則應該使該列引用另一個表的PRIMARY KEY,即

Table1 

| # | company_name | 
-------------------- 
| 1 | microsoft | 
| 2 | hp   | 
| 3 | asus   | 
| 4 | apple  | 
| 5 | amazon  | 
| 6 | CCN   | 

table2 
| # | company_id | user_name | 
-------------------------------- 
| 1 | 3   | x1  | 
| 2 | 4   | x1  | 
| 3 | 2   | x2  | 
| 4 | 3   | x2  | 
| 5 | 4   | x2  | 

這是您在數據庫設計/規範化中學到的第一件事情之一。在這種情況下,您將需要更改查詢。類似這樣的:

SELECT company_name,SUM(IF(user_name='x1',1,0)) as ordering 
FROM `table1` 
    LEFT JOIN `table2` ON table2.company_id=table1.id 
GROUP BY company_name 
ORDER BY ordering DESC 
+0

非常感謝我要去嘗試 – tony 2012-04-04 16:11:19

+0

請你可以檢查這是我寫代碼的方式SELECT table1.company_name,SUM(IF(table2.user_name ='x1',1,0))作爲排序FROM 'table2'左加入'table1' ON table2.company_id = table1.id GROUP BY table1.company_name ORDER BY訂購DESC,但它只顯示了通訊行而不是表中的所有行,請再次幫助 – tony 2012-04-04 16:43:24

+0

@tony我的壞表,以錯誤的順序。嘗試table1 LEFT JOIN table2 – liquorvicar 2012-04-04 16:46:43

相關問題