如何从1个列中选择数据mysql,其中许多id不同

时间:2016-06-10 16:30:35

标签: php mysql sql

我有一张表vớicolumAid是PRIMARY KEY,表b有colum Bid是主要的ky和colums Aids有1个recode = 1 list Aid。 例: 表a 援助| enter image description here

我想为每个出价计算多少援助(例如b1有2个a1)。我喜欢使用mysql但没有解决这个问题的方法。 谁可以帮助我

4 个答案:

答案 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 []>

<强> - )