2013-02-27 27 views
8

我有什么:下一个结构:SELECT数据在MySQL

table_zero
- >ID(PRIMARY有自动递增)
- >其他

table_1
- >ID(外键表零ID)
- > VARCHAR(80)实施例的值:(aahellobbb)
- > one_field

TABLE_2
- > (160)示例值:(aaececehellobbb)(>) - > other_field

我想要什么:搜索,并得到一个(ID,VARCHAR),包含所有的varchar字段的LIKE '%STR%' 匹配阵列。例如,如果我使用“hello”字符串进行搜索......我应该使用它们各自的id来获取两个示例值。这些ID总是会有所不同,因为它们是对PRIMARY KEY的引用。

我试过:我尝试过使用UNION ALL,但在我的例子中它不适用于LIMITS。

回答

9

通过使用UNION您可能会得到具有相同ID的若干行。怎么样使用LEFT JOIN

如果我明白你的问题:

SELECT table_zero.id, table_1.varchar_field, table_2.varchar_field 
FROM table_zero 
    LEFT JOIN table_1 ON table_zero.id = table_1.id 
    LEFT JOIN table_2 ON table_zero.id = table_2.id 
WHERE table_1.varchar_field LIKE '%str%' 
    OR table_2.varchar_field LIKE '%str%' 
+0

谢谢回答。它适用于我,但我得到了一对名为“名称”的两个字段。每对具有一个NULL值和匹配的字符串。这是正常的吗?我知道它是由于双桌搜索......但是,这似乎很奇怪。感谢您的回答;) – 2013-02-27 23:47:15

+2

如果您希望结果中只有一个字段包含匹配的字符串,您可以使用COALESCE(table_1.varchar_field,table_2.varchar_field)AS matched_string'而不是'table_1.varchar_field,table_2.varchar_field' – 2013-02-28 09:02:36

+0

太棒了! :D – 2013-02-28 15:02:28

2

试试这个

SELECT * 
FROM 
(
SELECT table_zero.id AS ID, table_1.varchar_field AS field 
FROM table_zero 
    JOIN table_1 ON table_zero.id = table_1.id 
WHERE table_1.varchar_field LIKE '%str%' 
UNION 
SELECT table_zero.id, table_2.varchar_field AS field 
FROM table_zero 
    JOIN table_2 ON table_zero.id = table_2.id 
) tbl 
WHERE 
tbl.field LIKE '%str%' 
+0

谢谢,但Frostys一个是最后一个;无论如何D投票! – 2013-02-28 15:03:17

+0

过度使用内存,选择200.000行时,如果意图按一列排序,则在20秒内限制0,10。 – 2014-04-25 16:51:04

1
SELECT table_zero.id, table_1.varchar_field, table_2.varchar_field 
FROM table_zero 
    LEFT JOIN table_1 ON table_zero.id = table_1.id 
    LEFT JOIN table_2 ON table_zero.id = table_2.id 
WHERE table_1.varchar_field LIKE '%str%' 
    OR table_2.varchar_field LIKE '%str%'