具有Where和Limit的多个表选择返回相同的行

问题描述 投票:-1回答:2

我试图从2个表中选择'limit = 3',但它在第一个表上返回相同的行。

atable
------------------
[a_id  -  a_title  -  a_status]
[id1a  -  title1a  -  1]
[id2a  -  title2a  -  1]
[id3a  -  title3a  -  1]

btable
------------------
[b_id  -  b_title  -  b_status]
[id1b  -  title1b  -  1]
[id2b  -  title2b  -  1]
[id3b  -  title3b  -  1]

询问

SELECT a.a_id
     , a.a_title, b.b_id
     , b.b_title 
  FROM atable a
     , btable b 
 WHERE a_status = 1 
   AND b_status = 1 
 LIMIT 3

结果

title1a   title1b
title1a   title2b
title1a   title3b

但我想要这样

title1a   title1b
title2a   title2b
title3a   title3b

我的查询中有什么问题?

编辑:经过几次尝试我选择所有行,但我如何实现此查询的限制3?我正在尝试添加限制时遇到语法错误。

SELECT a_title FROM atable LEFT JOIN btable ON (btable.b_id = atable.a_id) WHERE atable.a_status = 1 UNION SELECT b_title FROM btable RIGHT JOIN ON (btable.b_id = atable.a_id) WHERE btable.b_status = 1
mysql
2个回答
0
投票

您正在交叉连接两个表,这意味着数据乘以3x3。因此,您需要显示9行。

这描述了从title1a开始获得三个结果的原因。

如果atablebtable有关系,你需要加入两个表,然后你就可以获得正确的结果。


0
投票

您需要加入可以链接记录1-1的内容。

您当前的查询交叉将状态为1的所有表连接到状态为1的所有表。

例如,根据您的示例,在前6个字符上。

SELECT a.a_id, a.a_title, b.b_id, b.b_title 
FROM atable a
JOIN btable b 
  ON LEFT(b.b_title, 6) = LEFT(a.a_title, 6) AND b.b_status = 1 
WHERE a.a_status = 1 
LIMIT 3

LIMIT与它无关。这只是告诉MySql从完整结果返回多少行的方法。通常LIMIT与ORDER BY结合使用。

© www.soinside.com 2019 - 2024. All rights reserved.