链接到一行中的多个外部行

时间:2014-06-24 20:58:59

标签: mysql sql

我真的不知道这是怎么称呼所以我找不到答案。

例如,我有以下表格:

Table products                        Table users
+----------+----------+----------+    +----------+----------+
| id       | name     | price    |    | username | products |
+----------+----------+----------+    +----------+----------+
| 1        | Bread    | 1.5      |    | James    | 1, 2     |
+----------+----------+----------+    +----------+----------+
| 2        | Cookies  | 2.0      |    | David    | 2, 3     |
+----------+----------+----------+    +----------+----------+
| 3        | Milk     | 1.2      |    | Paul     | 3, 1     |
+----------+----------+----------+    +----------+----------+

products.idusers.products的外键。

我想使用MySQL查询获取所有David产品的名称和价格。这应该返回以下内容:

+----------+----------+
| name     | price    |
+----------+----------+
| Cookies  | 2.0      |
+----------+----------+
| Milk     | 1.2      |
+----------+----------+

我想最好使用JOIN功能,但大卫只能拥有1或100个产品。创建100列以适合所有产品听起来效率不高。

我怎么能意识到这一点?


目前我只是抓取所有内容并使用PHP过滤它,这不是问题,但随着表格的增长,我猜这将是非常低效的。

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

SELECT * FROM products pt
where FIND_IN_SET(pt.id,(select us.prices from users us 
WHERE us.username = "David"));

工作小提琴:http://sqlfiddle.com/#!2/4f78d/2

答案 1 :(得分:1)

这可以通过更改您的数据模型来解决。

users
+----------+----------+
| id       | username |
+----------+----------+
| 1        | Fred     |
+----------+----------+
| 2        | John     |
+----------+----------+

products                       
+----------+----------+----------+    
| id       | name     | price    |    
+----------+----------+----------+ 
| 1        | Bread    | 1.5      |   
+----------+----------+----------+ 
| 2        | Cookies  | 2.0      |  
+----------+----------+----------+   
| 3        | Milk     | 1.2      |  
+----------+----------+----------+ 

这就是魔术:你可以使用第三个表连接两个表:

user_procuct_connections
+----------+----------+------------+    
| id       | user_id  | product_id |    
+----------+----------+------------+ 
| 1        | 1        | 2          |   ->  Fred has Cookies
+----------+----------+------------+ 
| 2        | 1        | 3          |   ->  Fred also has Milk
+----------+----------+------------+   
| 3        | 2        | 1          |   ->  John has Bread
+----------+----------+------------+

如果您希望用户只能拥有一个产品,那么您可以删除id列,同时制作user_idproduct_id主键。

然后,当您想要获得所有Freds产品时,只需

SELECT 
    * 
FROM
    products
WHERE
    id IN (
    SELECT 
       product_id 
    FROM 
       user_procuct_connections 
    WHERE 
       user_id = 1
)

答案 2 :(得分:1)

'用户'的设计表错了。请改变设计,而不是解决这个糟糕的设计。

如此有效,你的设计可能就是这样:

表产品:

 ID        Name      Price
 1         Bread     1.5
 2         Cookies   2.0
 3         Milk      1.2

表用户:

 Username  Products

  James       1
  James       2
  David       2
  David       3
  Paul        3
  Paul        1

您会看到,每个用户可以有多行,即Users表中每个产品的一行。您可以维护另一个布尔字段,以确定哪些是当前活动的'或者'适用的'。加入'在这种情况下会容易得多。此外,更新记录也会更容易。如果将来你想要检索&分析历史记录中的数据,这也是可能的!!!

当前设计的另一个方面是,你不得不一次又一次地处理臭名昭着的逗号分离值#34;让我们说你有这样的记录:

 Username     Products

  James        1, 2, 3, 4, 5, 6, 7, 8, 9, 10

如果您需要将这些数据分类到行中,您必须解决“逗号分隔”的问题。价值这么多次。想象一下,为“' n'记录数量!!

希望这有帮助!!!

答案 3 :(得分:-1)

如果您加入以下表格:

SELECT name, price FROM products AS p INNER JOIN user_products AS up ON up.id = p.product_id AND up.user_id = <davids id>

您将获得一个数组,其中第一列是名称,第二列是价格。然后,您可以在PHP中执行所需的操作并更改阵列。您不必再过滤。