我有一张表vớicolumAid是PRIMARY KEY,表b有colum Bid是主要的ky和colums Aids有1个recode = 1 list Aid。 例: 表a 援助|
我想为每个出价计算多少援助(例如b1有2个a1)。我喜欢使用mysql但没有解决这个问题的方法。 谁可以帮助我
答案 0 :(得分:1)
这是非常糟糕的数据库设计!首先,在设计数据库时,不要传递正常的红色标记。其次,您不应该在数据库中使用列表,因为您正在重复不应重复的数据。
<强>解决方案:强>
首先,我会为两个表添加一个索引ID。然后我会创建一个名为&#39; AidsBid&#39;的交集表。然后,交集表将使用两个表中的ID,这反过来又将特定记录相互关联。
我建议您阅读普通表格并练习在纸上设计一些虚拟数据库。这将确保您设计的未来数据库符合NF规则,您可以更轻松地设计数据库。
答案 1 :(得分:0)
这是糟糕设计导致代码效率低下的一个很好的例子。是的,这可以通过嵌套的foreach循环内的查询来完成,这可能需要更长的时间,具体取决于表的大小。但是,添加关联表会更好。
请参阅以下链接以了解关联表:
https://en.wikipedia.org/wiki/Associative_entity
如果您有任何疑问,请随时提出。
答案 2 :(得分:0)
除了所有设计参数之外,这将获得您的子字符串计数:
SELECT ROUND ( ( LENGTH(Aids) - LENGTH( REPLACE ( Aids, "a1", "") ) ) / LENGTH("a1") ) AS count FROM `table b`
答案 3 :(得分:0)
这里有一个样本,但它只是一个样本。更好的是改变你的数据库设计。
查询
SELECT b.*,
CAST( MAX( ( IF ( a.Aid = 'a1' , ( LENGTH( CONCAT(b.Aids,','))
- LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
/ LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a1,
CAST( MAX( ( IF ( a.Aid = 'a2' , ( LENGTH( CONCAT(b.Aids,','))
- LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
/ LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a2,
CAST( MAX( ( IF ( a.Aid = 'a3' , ( LENGTH( CONCAT(b.Aids,','))
- LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
/ LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a3,
CAST( MAX( ( IF ( a.Aid = 'a4' , ( LENGTH( CONCAT(b.Aids,','))
- LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
/ LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a4,
CAST( MAX( ( IF ( a.Aid = 'a5' , ( LENGTH( CONCAT(b.Aids,','))
- LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
/ LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a5
FROM table_b b
CROSS JOIN table_a a
GROUP BY b.Bid;
示例 - 表格
MariaDB []> SELECT * from table_a;
+-----+
| Aid |
+-----+
| a1 |
| a2 |
| a3 |
| a4 |
| a5 |
+-----+
5 rows in set (0.00 sec)
MariaDB []> SELECT * from table_b;
+-----+-------------+
| Bid | Aids |
+-----+-------------+
| b1 | a1,a1,a2,a3 |
| b2 | a3,a4,a5,a5 |
| b3 | a2,a3,a3 |
| b4 | a5,a1,a1,a3 |
| b5 | a3,a2,a1 |
+-----+-------------+
5 rows in set (0.00 sec)
**运行查询**
MariaDB []> SELECT b.*,
-> CAST( MAX( ( IF ( a.Aid = 'a1' , ( LENGTH( CONCAT(b.Aids,','))
-> - LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
-> / LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a1,
->
-> CAST( MAX( ( IF ( a.Aid = 'a2' , ( LENGTH( CONCAT(b.Aids,','))
-> - LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
-> / LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a2,
->
-> CAST( MAX( ( IF ( a.Aid = 'a3' , ( LENGTH( CONCAT(b.Aids,','))
-> - LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
-> / LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a3,
->
-> CAST( MAX( ( IF ( a.Aid = 'a4' , ( LENGTH( CONCAT(b.Aids,','))
-> - LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
-> / LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a4,
->
-> CAST( MAX( ( IF ( a.Aid = 'a5' , ( LENGTH( CONCAT(b.Aids,','))
-> - LENGTH( REGEXP_REPLACE( CONCAT( b.Aids,','),CONCAT( a.Aid,',') ,'')))
-> / LENGTH( CONCAT( a.Aid,',')),0))) AS INT) AS a5
->
-> FROM table_b b
-> CROSS JOIN table_a a
-> GROUP BY b.Bid;
+-----+-------------+------+------+------+------+------+
| Bid | Aids | a1 | a2 | a3 | a4 | a5 |
+-----+-------------+------+------+------+------+------+
| b1 | a1,a1,a2,a3 | 2 | 1 | 1 | 0 | 0 |
| b2 | a3,a4,a5,a5 | 0 | 0 | 1 | 1 | 2 |
| b3 | a2,a3,a3 | 0 | 1 | 2 | 0 | 0 |
| b4 | a5,a1,a1,a3 | 2 | 0 | 1 | 0 | 1 |
| b5 | a3,a2,a1 | 1 | 1 | 1 | 0 | 0 |
+-----+-------------+------+------+------+------+------+
5 rows in set (0.00 sec)
MariaDB []>
<强> - )强>