我真的不知道这是怎么称呼所以我找不到答案。
例如,我有以下表格:
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.id
是users.products
的外键。
我想使用MySQL查询获取所有David产品的名称和价格。这应该返回以下内容:
+----------+----------+
| name | price |
+----------+----------+
| Cookies | 2.0 |
+----------+----------+
| Milk | 1.2 |
+----------+----------+
我想最好使用JOIN
功能,但大卫只能拥有1或100个产品。创建100列以适合所有产品听起来效率不高。
我怎么能意识到这一点?
目前我只是抓取所有内容并使用PHP过滤它,这不是问题,但随着表格的增长,我猜这将是非常低效的。
答案 0 :(得分:1)
你可以试试这个:
SELECT * FROM products pt
where FIND_IN_SET(pt.id,(select us.prices from users us
WHERE us.username = "David"));
答案 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_id
和product_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中执行所需的操作并更改阵列。您不必再过滤。