0

顧客ごとにアドレス帳のエントリが 1 つのみの顧客リストをエクスポートしようとしています。

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

私は何を間違っていますか?


編集: 一部の顧客は 2 つのアドレスを保存しているため、複数のアドレス帳エントリがあります。しかし、エクスポートには 1 つだけ必要です。

4

4 に答える 4

0

以下で行ったように、1 つの顧客 ID と 1 つの 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

これにより、他のすべてのフィールドの任意の値が取得されます。のフィールドcustomerの場合、値はすべての行で同じであるため問題ありません。のフィールドにはaddress_book、任意の値が選択されます。

理論的には、これにより異なる行の値が混在する可能性があります。これは実際には起こりませんが、保証はありません。これは、MySQL の Hidden Columns と呼ばれる機能を使用して目的を達成するための 1 つの方法です。

于 2013-02-23T00:20:51.260 に答える
0

アップデート:

どの 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
于 2013-02-23T00:21:14.880 に答える