在MySQL上加入多个表

时间:2016-01-27 01:02:02

标签: mysql

我有三个表(A,B,C),A有一个与B共享的密钥,B有一个与C共享的密钥。我必须将这三个表组合起来从A获取与列相关的信息在C.我的代码是:

SELECT
    a.x_code, a.item_id, c.action_type, c.item_name
FROM
    A a
        RIGHT OUTER JOIN
    B b ON b.item_id = a.item_id
        LEFT OUTER JOIN
    C c ON c.item_name = b.item_name

我在MySQL上运行它并且查询没有生成任何结果并且超时。

非常感谢任何帮助。

由于

3 个答案:

答案 0 :(得分:1)

不确定为什么需要外连接。试试这个。

SELECT
    a.x_code, b.item_id, c.action_type, b.item_name
FROM
    B b
       JOIN
    A a ON b.item_id = a.item_id
        JOIN
    C c ON c.item_name = b.item_name

注意我更改了表顺序并将连接表放在第一位。

如果你坚持使用外连接,请将连接更改为LEFT OUTER JOIN - 两者都是,并在查询结尾添加一个WHERE a.x_code IS NOT NULL和c.action_type IS NOT NULL。

答案 1 :(得分:0)

尝试此示例查询。

示例: 3个表格(产品,类别,子类别)
产品:product_id,product_name,cat_id
类别: cat_id,cat_name
子类别: subcat_id,subcat_name,cat_id

SELECT product.product_name, category.cat_name, subcategory.subcat_name
FROM product
INNER JOIN category ON product.cat_id = category.cat_id
INNER JOIN subcategory ON category.cat_id=subcategory.cat_id;

答案 2 :(得分:0)

尝试在join子句

中使用的列上设置非聚集索引

在这种情况下,列应为

    表b中的
  1. item_id (包括 item_name 到此索引)
  2. 表a中的
  3. item_id (包括 x_code 到此索引)
  4. 表c中的
  5. item_name (包括 action_type 到此索引)
  6. 这会强制查询优化器使用索引查找来避免全表扫描。

    将select子句中使用的列包含在索引中将保存许多不必要的页面(内存)访问,因为查询所需的数据可以在索引本身中找到。

    在许多情况下,外连接不使用索引,尝试使用索引提示强制它使用索引。

    注意:建议避免在列上设置索引,其中包含非常少的不同值或其中包含大量字符。