2012-03-28 80 views
0

我是新来的MySQL,和我运行此查询,MySQL冗余索引替代?

SELECT item_id,amount FROM db.invoice_line WHERE item_id = 'xxx' 
OR item_id = 'yyy' 
... 
AND invoice_id IN 
    (SELECT id_invoices FROM db.invoices 
    WHERE customer = 'zzzz' 
    AND transaction_date > DATE_SUB(NOW(), INTERVAL 6 MONTH) 
    AND sales_rep = 'aaa') ORDER BY item_id; 

也就是说,从那里的一个外键在另一个表中找到一个表中选择一些列。

问题是我想在结果中还有客户名称。但是,在发票行表中找不到客户名称,它位于发票表中。

虽然我可以在表创建和插入时天真地创建重复索引,但我想知道是否有SQL方法从发票表中选择适当的行并将其放在结果集中。

如果我只复制数据,性能会更好吗?

感谢, 丹麦

+0

你的问题与添加额外的索引无关。它似乎与添加适当的JOIN以将列添加到您的SELECT有关。如果您添加了一些示例数据和您想要的输出,这将有所帮助,这里的人员可以帮助您构建正确的查询。你可以编辑你的问题提供额外的信息?谢谢。 :) – 2012-03-28 00:28:00

回答

1

怎么这样呢?

SELECT 
    invoice_line.item_id, 
    invoice_line.amount, 
    invoices.customer_name 
FROM db.invoice_line 
INNER JOIN db.invoices 
    ON invoice_line.invoice_id = invoices.id_invoices 
WHERE invoices.customer = 'zzzz' 
AND invoices.transaction_date > DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH) 
AND invoices.sales_rep = 'aaa' 
AND (invoice_line.item_id = 'xxx' OR invoice_line.item_id = 'yyy') 
ORDER BY invoice_line.item_id; 
1

在表格之间使用连接来实现您的结果。