在MySQL中从两个表中选择数据

12

我有什么:下一个结构:

table_zero
-> id (具有自动递增的主键)
-> 其他

table_1
-> id (指向 table_zero id 的外键)
-> varchar(80) 示例值:(aahellobbb)
-> one_field

table_2
-> id (指向 table_zero id 的外键)
-> varchar(160) 示例值:(aaececehellobbb)
-> other_field

我想要什么:搜索并获取包含在 varchar 字段上 LIKE '%str%' 的所有匹配项的 (id,varchar) 数组。例如,如果我使用 "hello" 字符串进行搜索,则应该获取它们各自的示例值和相应的 id。这些 id 总是不同的,因为它们是对主键的引用。

我尝试了什么:我尝试使用 UNION ALL,但在我的例子中它无法与 LIMITS 一起使用。

3个回答

17
通过使用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%'

谢谢你的回答。这对我很有用,但是我得到了一对名为“name”的两个字段。每一对都有一个NULL值和匹配的字符串。这正常吗?我知道这是由于双重表搜索引起的...但这似乎有些奇怪。感谢您的回答 ;) - Mark Tower
2
如果您只想在结果中包含匹配字符串的一个字段,可以使用COALESCE(table_1.varchar_field, table_2.varchar_field) AS matched_string代替table_1.varchar_field, table_2.varchar_field - Maxime Pacary

3
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%'

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%'

谢谢,但Frostys的确是最终版本;D 无论如何都投赞成票! - Mark Tower
过度使用内存,在20秒内选择200,000行限制为0、10,当意图按一列排序时。 - e-info128

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接