2012-05-01 202 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

相关问题