2013-02-23 68 views
0

我正在尝试导出每个客户只有一个地址簿条目的客户列表。如何限制连接查询?

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
ab.address_book_id, ab.customers_id, ab.entry_company, ab.entry_firstname, ab.entry_lastname, ab.entry_street_address 
FROM customers c 
INNER JOIN address_book ab 
ON c.customers_id=ab.customers_id 
WHERE 1=1 
ORDER BY c.customers_id ASC 

我在做什么错?


编辑:我有超过1个地址簿条目,因为有些客户有2个保存的地址。但我只需要一个出口。

+0

怎么了'WHERE 1 = 1'?你的查询到底有什么问题?它不起作用吗?它不会返回正确的结果吗? *您想要返回哪个*地址簿条目? – 2013-02-23 00:14:50

+0

1. WHERE 1 = 1是多余的2.为什么你在address_book中每个客户有超过一个条目?和3.因为你有多个条目 - 你应该选择显示哪一个? – alfasin 2013-02-23 00:15:26

+0

哪个address_book条目返回的决定因素是什么? – sgeddes 2013-02-23 00:17:05

回答

0

创建一个表,只有像我已经做了以下

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
ab.address_book_id, ab.customers_id, ab.entry_company, ab.entry_firstname,  ab.entry_lastname, ab.entry_street_address 
FROM customers c 
INNER JOIN address_book ab ON c.customers_id=ab.customers_id 
INNER JOIN 
(SELECT customers_id, MAX(address_book_id) AS AddressBookID 
    FROM address_book 
    GROUP BY customers_id) AS NewAddressBook ON c.customers_id = NewAddressBook.customers_id AND ab.address_book_id = NewAddressBook.AddressBookID 
ORDER BY c.customers_id ASC 
0

我认为这应该工作返回一个客户ID和一个address_book_id - 它返回的MIN(address_book_id):

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
    ab.address_book_id, ab.customers_id, ab.entry_company, ab.entry_firstname, ab.entry_lastname, ab.entry_street_address 
FROM customers c 
    INNER JOIN address_book ab 
     ON c.customers_id=ab.customers_id 
    INNER JOIN (
     SELECT MIN(address_book_id) min_address_book_id, customers_id 
     FROM address_book 
     GROUP BY customers_id 
    ) m ON ab.customers_id = m.customers_id AND 
     ab.address_book_id = m.min_address_book_id 
ORDER BY c.customers_id ASC 
+0

这个答案和我的答案都将工作 - 唯一的区别是他选择了“MIN”,我在我的查询中选择了“MAX”。 – 2013-02-23 00:27:21

+0

@MattBusche - 完全同意 - 都能很好地工作 - 只需删除“ab”。因为您没有在子查询中对表进行别名,所以您的字段名称不是别名。 – sgeddes 2013-02-23 00:30:05

+0

好抓。我修复了我的子查询(然后尝试编辑您在GROUP BY上的同一时间) – 2013-02-23 00:31:29

0

在MySQL中,你可以做到以下几点:

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
ab.address_book_id, ab.customers_id, ab.entry_company, ab.entry_firstname, ab.entry_lastname, ab.entry_street_address 
FROM customers c 
INNER JOIN address_book ab 
ON c.customers_id=ab.customers_id 
group by c.customers_id 
ORDER BY c.customers_id ASC 

这拉的个任意值为所有其他领域。对于customer的字段,这些值是正确的,因为它们在所有行上都是相同的。对于​​的字段,选择一个任意值。

理论上,这可以混合来自不同行的值。虽然这在实践中没有发生,但没有保证。因此,这是一种使用MySQL中的隐藏列功能来执行所需操作的方法。

0

UPDATE:

由于没关系你这address_book条目检索,这个查询将与最大address_book_id值取的:

SELECT c.customers_id, 
     c.customers_firstname, 
     c.customers_lastname, 
     ab.address_book_id, 
     ab.customers_id, 
     ab.entry_company, 
     ab.entry_firstname, 
     ab.entry_lastname, 
     ab.entry_street_address 
    FROM customers c LEFT JOIN 
     address_book ab ON c.customers_id=ab.customers_id AND 
     ab.address_book_id = (SELECT MAX(address_book_id) 
           FROM address_book 
          WHERE customers_id = c.customers_id) 
ORDER BY c.customers_id; 

在理论上可以有顾客没有关联的地址簿条目。 LEFT JOIN将允许你拉他们。如果您不想要这种行为,只需将LEFT JOIN更改为INNER JOIN即可。

这里工作sqlfiddle

原来的答案

这是我的第一个答案,它会在MySQL的,虽然它可以任意取不同值的行。请参阅@Gordon Linoff的答案中的解释。

SELECT c.customers_id, 
     c.customers_firstname, 
     c.customers_lastname, 
     MAX(ab.address_book_id), 
     MAX(ab.customers_id), 
     MAX(ab.entry_company), 
     MAX(ab.entry_firstname), 
     MAX(ab.entry_lastname), 
     MAX(ab.entry_street_address) 
FROM customers c INNER JOIN 
    address_book ON c.customers_id=ab.customers_id 
GROUP BY c.customers_id, c.customers_firstname, c.customers_lastname, 
ORDER BY c.customers_id 
+0

理论上可以。不是最好的方式去我同意。 – peterm 2013-02-23 01:14:27