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 个保存的地址。但我只需要一个用于出口。

4

4 回答 4

0

创建一个只返回一个客户 ID 和一个 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 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
于 2013-02-23T00:20:04.357 回答
0

我认为这应该可行——它返回 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
于 2013-02-23T00:20:12.033 回答
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

这会为所有其他字段提取任意值。对于 from 的字段customer,值很好,因为它们在所有行上都是相同的。对于来自 的字段address_book,选择任意值。

理论上,这可以混合来自不同行的值。尽管这在实践中不会发生,但也不能保证。因此,这是一种使用 MySQL 中名为 Hidden Columns 的功能来做你想做的事情的方法。

于 2013-02-23T00:20:51.260 回答
0

更新:

由于检索哪些地址簿条目对您无关紧要,因此此查询将获取具有最大值的条目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 JOININNER 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
于 2013-02-23T00:21:14.880 回答