2009-04-23 33 views
2

有一個在紙上看起來很容易的問題,但我有一個很大的問題,弄清楚如何最好地編寫單個查詢。SQL查詢問題。我應該使用聯盟嗎?

我有一個表

 
CREATE TABLE `profile_values` ( 
    `fid` int(10) unsigned NOT NULL default '0', 
    `uid` int(10) unsigned NOT NULL default '0', 
    `value` text, 
    PRIMARY KEY (`uid`,`fid`), 
    KEY `fid` (`fid`) 
) 

此表的一點是檔案信息存儲的用戶。
例如一個典型的行會是這樣的..

 
fid | uid | value 
__________________ 
1 | 77 | Mary 
11 | 77 | Poppins 
1 | 123 | Steve 
11 | 123 | Davis 

注:

 
'fid' of '1' represents the first name 
'fid' of '11' represents the last name 
'uid' is a users id within the site. 

我想實現的就是找回所有的UID滿足名字的條件,如「S%」和姓氏像'D%'。
我需要這個的原因是因爲我有一個網站用戶的自動完成搜索框。
因此,如果我在搜索框中鍵入'S',我將看到以字母'S'開頭的所有用戶列表,如果我現在鍵入空格並且'D',我現在應該能夠看到用戶列表誰符合這兩個條件。

有沒有人有任何想法這可以實現? 在此先感謝。

回答

4
select firstname.uid, fistname.value, lastname.value 
from 
    profile_values firstname 
    inner join profile_values lastname 
    on firstname.uid = lastname.uid 
WHERE 
    firstname.fid = 1 
    AND lastname.fid = 11 
    AND fistname.value like 'S%' 
    AND lastname.value like 'D%' 

,或者與用戶表

select users.uid, fistname.value, lastname.value 
from 
    users 
    inner join profile_values firstname 
    on firstname.uid = users.uid 
    AND firstname.fid = 1 
    inner join profile_values lastname 
    on lastname.uid = users.uid 
    AND lastname.fid = 11 
WHERE 
    fistname.value like 'S%' 
    AND lastname.value like 'D%' 

編輯:

忘了提:工會在許多DBMS執行不好。如果你需要一個聯合,你的數據庫模型大多數有問題。在使用union之前使用其他選擇。

+0

謝謝你的提示和解決方案。讚賞:)。 這適用於所有其他人也很好回覆也。 – wkmit 2009-04-23 13:40:03

2
SELECT * 
FROM profile_values pv1 
WHERE pv1.fid = 1 
     AND pv1.value LIKE 'M%' 
JOIN profile_values pv11 
ON  pv11.fid = 11 
     AND pv11.value LIKE 'D%' 
     AND pv11.uid = pv1.id 
2

加入上profile_values 兩次這樣的:

SELECT p1.uid 
FROM profile_values p1, profile_values p2 
WHERE p1.uid=p2.uid AND p1.fid=1 AND p2.fid=11 
    AND p1.value LIKE 'S%' 
    AND p2.value LIKE 'D%' 
+1

這是通過where子句有效創建交叉聯接和篩選,而不是執行內部聯接,因此性能較低 – CodeMonkey1313 2009-04-23 12:09:01

+0

@ MasterMax1313:您是對的,並且非常感謝您指出了這一點。這對於大型桌子來說當然是需要考慮的。 – 2009-04-23 13:39:14

4

還有你的表格看起來像inner-platform effect反模式的一個典型例子。

因此,不是在短期內(已經完成)回答您的問題,而是從長遠的角度回答您的目標應該是更改數據庫,以便名字和姓氏存儲在他們自己的專欄。這些可以被索引,因此這種類型的搜索將更快,並且它們將更容易處理,因爲您可以直接使用列名稱。

您使用數字來引用存儲在列中的數據類型的事實表明,實際使用的數據類型數量是有限的,這意味着它們可以分解爲單獨的列(如果空間是關心和許多值爲空,那麼你可以使用稀疏列)。

然後將查詢只會是這樣的:

select * from users where first_name like 's%' and last_name like 'd%'