加入第二个表,其中字段的出现次数最多

时间:2014-04-02 16:08:06

标签: mysql sql database

我需要加入一个特定的表,但我只想从第二个表中获取具有特定字符出现次数最多的行。

例如 两张桌子 来自 - >的一对多关系B'/ P>

b有一个外键和一个字符串。我只希望b中包含最多'/'字符的行。

select a.*, b.string
from a join b on a.pk = b.fk

通过做类似的事情,我可以得到最高的数字。

MAX(LENGTH(b.string) - LENGTH(REPLACE(b.string, '/', '')))
group by b.fk

但那不是我可以加入的东西。

我尝试使用带有子查询的order by limit 1,但我的MySQL版本不支持限制。

2 个答案:

答案 0 :(得分:1)

  DROP TABLE IF EXISTS my_table;

  CREATE TABLE my_table
  (id INT NULL AUTO_INCREMENT PRIMARY KEY
  ,string_id INT NOT NULL
  ,string VARCHAR(12) NOT NULL
  ,UNIQUE (string_id,string)
  );

  INSERT INTO my_table (string_id,string) VALUES
  (1,'///'),
  (1,'////'),
  (1,'/////'),
  (1,'//'),
  (1,'/'),
  (2,'/'),
  (2,'//'),
  (3,'///'),
  (3,'//'),
  (4,'///'),
  (4,'/');

  SELECT * FROM my_table;
  +----+-----------+--------+
  | id | string_id | string |
  +----+-----------+--------+
  |  5 |         1 | /      |
  |  4 |         1 | //     |
  |  1 |         1 | ///    |
  |  2 |         1 | ////   |
  |  3 |         1 | /////  |
  |  6 |         2 | /      |
  |  7 |         2 | //     |
  |  9 |         3 | //     |
  |  8 |         3 | ///    |
  | 11 |         4 | /      |
  | 10 |         4 | ///    |
  +----+-----------+--------+

  SELECT x.*
    FROM my_table x
    JOIN ( SELECT string_id,MAX(LENGTH(string) - LENGTH(REPLACE(string, '/', ''))) max_string FROM my_table GROUP BY string_id) y
      ON y.string_id = x.string_id
     AND y.max_string = LENGTH(x.string) - LENGTH(REPLACE(x.string, '/', ''));
  +----+-----------+--------+
  | id | string_id | string |
  +----+-----------+--------+
  |  3 |         1 | /////  |
  |  7 |         2 | //     |
  |  8 |         3 | ///    |
  | 10 |         4 | ///    |
  +----+-----------+--------+

答案 1 :(得分:0)

您可以尝试使用HAVING子句编写的查询,其中HAVING子句可以指定您需要的表达式

SELECT... FROM... GROUP BY... HAVING MAX(LENGTH(b.string) - LENGTH(REPLACE(b.string,'/','')));