具有奇怪设置的多级mysql查询

时间:2013-07-02 04:13:42

标签: mysql sql join

我有问题。我是一个编码新手,学习PHP和mysql,因为我去。 我正在处理一个应用程序并遇到了一个我无法弄清楚的问题。

我有三张桌子:

类别:

+-----------+----------+--------------------+
| id        | name     | sort |   active    |
+-----------+----------+--------------------+
|         1 | apple    |    1 |      1      |
|         2 | mango    |    2 |      1      |
|         3 | blueberry|    3 |      0      |
+-----------+----------+--------------------+

服务:

+-----------+----------+----------------------------------------+
| id        | category_id | name   | sort |active| process_time |
+-----------+------+------+--------+------+------+--------------+
|         1 |     1       | slices |  1   |  1   |  2 hours     |
|         2 |     1       |  half  |  2   |  1   |  6 hours     |
|         3 |     2       | slices |  1   |  1   |  1   hour    |
|         4 |     2       | whole  |  2   |  1   |  6  hours    |
|         5 |     3       | bunch  |  1   |  0   |  12 hours    |
|         6 |     3       | a lot  |  2   |  1   |  10 hours    |
+-----------+------+---------+------+-------------+-------------+

user_price:


+-----------+----------+------+-------+---------+---------+---------+---------+
| id        | user_id  | 1    |   2   |   3     |    4    |    5    |    6    |    
+-----------+----------+------+-------+---------+---------+---------+---------+
|         1 | 20       |    1 |   1   |   5     |    4    |    6    |    6    |
|         2 | 22       |    2 |   1   |   2     |    3    |    5    |    1    |
|         3 | 32       |    3 |   2   |   7     |    4    |    1    |    3    |
+-----------+----------+------+-------+---------+---------+---------+---------+

类别包含我在商店中销售的类别 服务具有我在商店中提供的服务,它们与类别相对应,并且仅对该类别是唯一的 价格具有我向客户收取的用户价格,每个用户都有不同的价格,价格表中的列名对应于服务ID。

以下是包含示例数据的 SQLFiddle

现在问题是,在一次扫描中,我想得到一行,其中包含来自user_id 22的所有三个表的列(user_id仅用于价格)


+---------------+----------------+-----------------+------------------+-----------+
| service_id    | category_name  | service_name    |   process_time   |   price   |  
+---------------+----------------+-----------------+------------------+-----------+
|  3            |  mango         | slices          |   1 hour         |    2      |
+---------------+----------------+-----------------+------------------+-----------+

任何想法???

1 个答案:

答案 0 :(得分:0)

尝试

SELECT s.id service_id, 
       c.name category_name, 
       s.name service_name, 
       s.process_time, 
       p.`3` price
  FROM service s JOIN category c
    ON s.category_id = c.id JOIN user_price p
    ON p.user_id = 22
 WHERE s.id = 3

输出:

| SERVICE_ID | CATEGORY_NAME | SERVICE_NAME | PROCESS_TIME | PRICE |
--------------------------------------------------------------------
|          3 |         mango |       slices |       1 hour |     2 |

这是 SQLFiddle 演示


现在虽然还不算太晚,但请将user_price table标准化。从长远来看,这将为您省去很多麻烦。

此表的续订架构可能类似于

CREATE TABLE IF NOT EXISTS user_price
(
    id int(11) NOT NULL AUTO_INCREMENT, 
    user_id int(11) NOT NULL, 
    service_id int(11) NOT NULL,
    price decimal(19,2) DEFAULT '0.00',
    PRIMARY KEY (id), 
    FOREIGN KEY (service_id) REFERENCES service (id),
    UNIQUE KEY  (user_id, service_id) 
);

使用此表的正确查询

SELECT s.id service_id, 
       c.name category_name, 
       s.name service_name, 
       s.process_time, 
       p.price
  FROM service s JOIN category c
    ON s.category_id = c.id JOIN user_price p
    ON s.id = p.service_id 
   AND p.user_id = 22 
 WHERE s.id = 3

这是 SQLFiddle 演示。 在此示例中,表格已命名为user_price1,以便同时显示两个查询。