0

私は問題があります。私はコーディングの初心者であり、PHP と mysql を学びながら学んでいます。私はアプリケーションに取り組んでいて、理解できない問題に遭遇しました。

私は3つのテーブルを持っています:

カテゴリー:

+----------+----------+--------------------+
| | ID | 名前 | ソート | アクティブ |
+----------+----------+--------------------+
| | 1 | リンゴ | 1 | 1 |
| | 2 | マンゴー | 2 | 1 |
| | 3 | ブルーベリー| 3 | 0 |
+----------+----------+--------------------+

サービス :

+----------+----------+-------------------------- --------------+
| | ID | カテゴリ 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 | ユーザー 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 を次に示します。

ここに問題があります。1 回のスイープで、user_id 22 の 3 つのテーブルすべての列を含む行を取得したいと考えています (user_id は価格にのみ使用されます)。

+--------------+----------------+---------------- ----------------------+-----------------------+
| | サービス 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

出力:

| | サービス_ID | CATEGORY_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 に答える