2012-05-01 391 views
2

我有兩個表的mysql數據庫:用戶和項目。他們是這樣的:mysql - 從表中選擇值來自另一個表的LIKE值

用戶:

id | user_name | desc 
-------------------------- 
1 | john  | tall 
2 | dave  | fat 
3 | maria  | pretty 

項目:

id | item_name | color 
-------------------------- 
1 | trousers | red 
2 | shoes  | blue 
3 | shoes  | red 

我想從具有特定的標識和名稱的它就像一個關鍵字項目的數據庫列表中進行選擇。這是使用簡單的搜索引擎。 我作出這樣的查詢:

SELECT id, user_name, (SELECT item_name FROM items WHERE id = u.id) as desc FROM users u WHERE desc LIKE "%shoes%" AND color LIKE "%blue%" 

因此我預計包含ID = 2一行,用戶名=戴夫和ITEMNAME =鞋,因爲它是唯一一個行履行我的查詢。不幸的是我收到一條消息,說沒有'desc'列。我知道'users'中沒有這樣的列,但是如何告訴mysql從名爲desc的子查詢中獲取它?

附加問題:是否可以使用WHERE ... LIKE命令和數組樣式,如IN(val1,val2,val3)?我的意思是不是過長...查詢:

SELECT name FROM users WHERE name LIKE "%john%" OR name LIKE "%steven%" OR name LIKE "bob%" 

使短:提前

SELECT name FROM users WHERE name LIKE IN ("%john%", "%steven%", "%bob%") 

感謝。

回答

3

試試這個:

SELECT 
    u.id, u.user_name, i.item_name, i.color 
FROM 
    users AS u, 
    items AS i 
WHERE 
    i.id = u.id 
AND 
    i.item_name LIKE "%shoes%" 
AND 
    i.color LIKE "%blue%" 

對於第二部分,如果你看一下這個頁面在MySQL dev site你會看到,你可以使用REGEXP來匹配你的結果,而不是LIKE所以你我覺得你可以使用類似於

REGEXP 'john|steven|bob'

+0

謝謝 - 你的建議對我很好。沒讀你提出的文章,但我會。 +1爲你 – Kalreg

2

您需要使用項目進行內部聯接。我也不認爲你可以使用desc。已經使用DESCR在我的答案,而不是

沒有測試過這一點,但請嘗試以下

SELECT u.id, u.user_name, i.item_name as descr 
FROM users u INNER JOIN items i 
ON i.id = u.id 
WHERE i.item_name LIKE '%shoes%' 
AND i.color LIKE '%blue%' 
1

經過幾個小時的徘徊搜索正確的語法,我發現我在找什麼。 最好的方法,而不是使用正則表達式和複雜的查詢,我建議使用concat將所有列名連接到字符串上,然後通過儘可能多的LIKEs來搜索它,因爲我們有關鍵字。也許這看起來不起優雅,但對我來說足夠好。例如:

SELECT user_name, item_name FROM table WHERE CONCAT(user_name, item_name) LIKE '%keyword1%' 

查找出NULL的記錄 - 如果你使用空Concat的只有一個字段,結果就變成零也因此使用IFNULL(null_record, '')。

希望它可以幫助任何人。

1
SELECT * 
FROM users u 
WHERE 
    u.id IN (SELECT id 
       FROM items 
       WHERE 
        items.id=u.id 
       AND 
        color LIKE '%$search%' 
       AND 
        item_name LIKE '%$search%' 
      ) 
+1

而不是在你的答案中做瘋狂的HTML,你最好只使用4個空格來隱藏你的代碼。着色和突出顯示將自動應用。 – j0k

相關問題