2013-07-11 3 views
1

У меня есть следующий MySql структуру таблицы:объединить три таблицы и подсчитать конкретное значение с 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. ИДС в таблице «Последовательный ' является фирмой id из таблицы ' компания '
  2. nr в таблице «продукт» определяет, как должны быть первые три цифры серийного номера для желаемого продукта.

Что мне нужно сделать, это выход, как это:

+-------------+--------------------------------------+ 
| 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-запроса, чтобы получить выход, как описано выше?

+1

Если вы в состоянии это сделать, вы должны по-разному разбить столбец Serial так, чтобы он имел FK в таблице Product, а фактический столбец Serial - это что-то вроде «A000001». Как и сейчас, это частично производная область. Это сделает его более удобным для вас. Кроме того, FK - это сильные отношения. Это можно использовать для обеспечения целостности данных. В противном случае кто-то мог бы поместить что-то вроде «ABCA000001», и у вас не было бы хорошего способа понять, что «ABC» - это не продукт –

ответ

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 
+0

Действительно отличный @Barmar! Можно ли поместить пробел после,? В момент я получаю результаты, такие как: Ball, Phone, Egg, но я бы хотел получить Ball, Phone, Egg. Большое спасибо за Вашу помощь. – emjay

+1

Конечно. Используйте опцию 'SEPARATOR' в' GROUP_CONCAT'. Разве вы не можете прочитать документацию, вместо того, чтобы все, что вам кормили? http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – Barmar

+0

Да, конечно, я могу прочитать документацию. :) Прежде чем вы будете комментировать, я не знал, где искать другие варианты. Еще раз спасибо Бармару. – emjay

 Смежные вопросы

  • Нет связанных вопросов^_^