MySQL格式化结果基于表名和多个表数据

时间:2016-01-24 21:31:28

标签: php mysql

我正在进入这个项目并且有一些MySQL背景来做基本的SELECT和INSERT等等。但是,这让我在墙上撞到了我的头。

我在MySQL中有一个典型的用户信息表:

USERS
+-------+----------+---------+-----+
|user_id|first_name|last_name|email|
+-------+----------+---------+-----+
 1       tim        jones     tj@acme.com
 2       sarah      peteres   sp@acme.com
 3       larry      doe       ld@acme.com

然后我有多个产品表:

PRODUCTS_ONE
+-------+-------+---------+----------+--------------+
|prod_id|user_id|prod_name|prod_width|prod_ship_date|
+-------+-------+---------+----------+--------------+
 1       1       bowl      nine       1-1-16
 2       1       fork      one        1-2-16
 3       2       plate     eleven     1-3-16

PRODUCTS_TWO
+-------+-------+----------+--------+--------------+
|prod_id|user_id|prod_state|prod_job|prod_ship_date|
+-------+-------+----------+--------+--------------+
 1       3       maine      min      1-1-16
 2       2       texas      max      1-2-16
 3       1       ohio       min      1-1-16

我总共有15个PRODUCT表,都有prod_id,users_id和prod_ship_date。其他字段可能根据它们所在的产品表而有所不同。但是,所有不同的PRODUCT表都有这三个常见字段。

我要完成的是获取与某个发货日期匹配的产品的用户信息和产品信息列表。

我想找到所有用户以及他们在特定日期获得的产品表和产品ID。

所以,如果我在1-1-16的发货日期搜索,我会得到类似的东西:

+----------------+-----------+-------------+-----------+
|users.first_name|users.email|product_table|products_id|
+----------------+-----------+-------------+-----------+
 tim              tj@acme.com one,two       1,3
 larry            ld@acme.com one           3

如果我在1-2-16的发货日期搜索,我会得到类似的东西:

+----------------+-----------+-------------+-----------+
|users.first_name|users.email|product_table|products_id|
+----------------+-----------+-------------+-----------+
 tim              tj@acme.com one           2
 sarah            sp@acme.com two           2

我希望这一切都有道理。遗憾的是,由于遗留问题,我无法更改各种产品表的结构或布局。

我无法弄清楚用于获取类似内容的MySQL语句。

以上结果将用于报告目的。

1 个答案:

答案 0 :(得分:1)

你可以这样写一个查询:

select first_name,email,prod_id,group_concat(product_table) as product_table from (
select u.user_id ,first_name,email,prod_id, 'one' as product_table from users u join products_one p on u.user_id = p.user_id where prod_ship_date = '2016-01-01 00:00:00'
union
select u.user_id,first_name,email,prod_id, 'two' as product_table  from users u join products_two p on u.user_id = p.user_id where prod_ship_date = '2016-01-01 00:00:00'
) a

按a.user_id分组

按user_id,product_table命令

等等。

使用第二组concat并按

排序
select first_name,email,group_concat(prod_id),group_concat(product_table) as product_table from (
select u.user_id ,first_name,email,prod_id, 'one' as product_table from users u join products_one p on u.user_id = p.user_id where prod_ship_date = '2016-01-01 00:00:00'
union
select u.user_id,first_name,email,prod_id, 'two' as product_table  from users u join products_two p on u.user_id = p.user_id where prod_ship_date = '2016-01-01 00:00:00'
) a


group by a.user_id

order by user_id,product_table

查看此sqlfiddle