1

次の mySQL テーブル構造があります。

Table 'company'         Table 'serial'                   Table 'product'
+----+--------------+   +-------------------+--------+   +-----+---------+
| id | name         |   | serial            |cid     |   | nr  | name    |
+----+--------------+   +-------------------+--------+   +-----+---------+
|  1 | One Inc.     |   | 100A000001        |      1 |   | 100 | Phone   |
|  2 | Two Corp.    |   | 100A000002        |      1 |   | 101 | Ball    |
|  3 | Three Corp.  |   | 102A000003        |      1 |   | 102 | Egg     |
|  4 | Four Inc.    |   | 103A000004        |      2 |   | 103 | Box     |
|  5 | Five Inc.    |   | 103A000005        |      3 |   | 104 | Cable   |
+----+--------------+   | 101A000006        |      4 |   +-----+---------+
                        | 102A000007        |      4 |
                        | 103A000011        |      5 |
                        | 103A000010        |      5 |
                        | 104A000007        |      5 |
                        | 104A000008        |      5 |
                        | 103A000009        |      5 |
                        +-------------------+--------+

それらがどのように連携するかについての簡単な説明:

  1. テーブル'serial' のcidは、テーブル'company' の会社 IDです。
  2. テーブル'product' のnrは、目的の製品のシリアル番号の最初の 3 桁を定義します。

私がする必要があるのは、次のような出力です。

+-------------+--------------------------------------+
| Customer    | Products                             |
+-------------+--------------------------------------+
| One Inc.    | Phone (2), Egg (1)                   |
+-------------+--------------------------------------+
| Two Corp.   | Box (1)                              |
+-------------+--------------------------------------+
| Three Corp. | Box (1)                              |
+-------------+--------------------------------------+
| Four Inc.   | Phone (1), Ball (1)                  |
+-------------+--------------------------------------+
| Five Inc.   | Box (3), Cable (2)                   |
+-------------+--------------------------------------+

しかし、クエリの書き方がわかりません!

現時点での私の解決策は、次のクエリです。

SELECT
    c.name,
    s.serial
FROM
    company c
INNER JOIN
    serial s
ON
    c.id = s.cid
ORDER BY
    c.name DESC

これにより、次のような出力が生成されます。

+-------------+--------------+ 
| Customer    | Serial       |
+-------------+--------------+ 
| One Inc.    | 100A000001   |
| One Inc.    | 100A000002   |
| One Inc.    | 102A000003   |
| Two Corp.   | 103A000004   |
| Three Corp. | 103A000005   |
| Four Inc.   | 101A000006   |
| Four Inc.   | 102A000007   |
| Five Inc.   | 103A000011   |
| Five Inc.   | 103A000010   |
| Five Inc.   | 104A000007   |
| Five Inc.   | 104A000008   |
| Five Inc.   | 103A000009   |
+-------------+--------------+

現時点では、私はこの出力を使用しており、PHP を使用して目的の出力を生成していますが、PHP をあまり使用せずにそれを行うのは素晴らしいことです。

だから私が求めているのは、上記のような出力を得るために、素敵なmySQLクエリでこれを解決するにはどうすればよいですか?

4

1 に答える 1

2
SELECT Customer, GROUP_CONCAT(CONCAT(pname, ' (', pcount, ')')) Products
FROM (
    SELECT
        c.name Customer,
        p.name pname,
        COUNT(*) pcount
    FROM
        company c
    INNER JOIN
        serial s
    ON
        c.id = s.cid
    INNER JOIN
        product p
    ON p.nr = LEFT(s.serial, 3)
    GROUP BY Customer, pname) x
GROUP BY Customer
ORDER BY
    Customer DESC
于 2013-07-11T16:10:22.647 に答える