0

我有个问题。我是一名编码新手,边走边学 php 和 mysql。我正在开发一个应用程序并遇到了一个我无法弄清楚的问题。

我有三张桌子:

类别:

+-----------+---------+--------+
| 编号 | 姓名 | 排序 | 活跃 |
+-----------+---------+--------+
| 1 | 苹果| 高分辨率照片| CLIPARTO 1 | 1 |
| 2 | 芒果 | 2 | 1 |
| 3 | 蓝莓| 3 | 0 |
+-----------+---------+--------+

服务 :

+-----------+---------+-------------- --------------+
| 编号 | 类别 ID | 姓名 | 排序 |活跃| 处理时间 |
+-----------+------+------+--------+------+------+ --------------+
| 1 | 1 | 切片 | 1 | 1 | 2 小时 |
| 2 | 1 | 一半 | 2 | 1 | 6 小时 |
| 3 | 2 | 切片 | 1 | 1 | 1 小时 |
| 4 | 2 | 整体| 2 | 1 | 6 小时 |
| 5 | 3 | 一堆 | 1 | 0 | 12 小时 |
| 6 | 3 | 很多| 2 | 1 | 10 小时 |
+-----------+------+---------+------+------------- +--------------+

用户价格:

+-----------+---------+------+-------+---------+- --------+---------+---------+
| 编号 | 用户 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 仅用于价格)

+---------------+----------------+---------------- -+------------------+----------+
| 服务标识 | 类别名称 | 服务名称 | 处理时间 | 价格 |  
+---------------+----------------+---------------- -+------------------+----------+
| 3 | 芒果 | 切片 | 1 小时 | 2 |
+---------------+----------------+---------------- -+------------------+----------+

有任何想法吗???

4

1 回答 1

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 | 类别名称 | SERVICE_NAME | PROCESS_TIME | 价格 |
-------------------------------------------------- ------------------
| 3 | 芒果 | 切片 | 1 小时 | 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并排显示两个查询。

于 2013-07-02T04:27:09.493 回答