【问题标题】:MySQL - Sort and limit by table stringMySQL - 按表字符串排序和限制
【发布时间】:2011-01-15 21:15:56
【问题描述】:

我有两个 mysql 表。一张带字符串的表,例如 abc、def、ghi、jkl。另一个表包含有关另一个表中的字符串的信息,例如“字母表中的三个首字母”、“字母表中的 3-6 个字母”等。此表中的每个字符串可以有多个(大约 25 行)。

我想从第二个表中为第一个中的每个字符串返回 3 行,例如:

table1.string | table2.info
---------------------------
abc           | blahblah
abc           | blahblah2
def           | blahblah
abc           | blahblah3
def           | blahblah2
def           | blahblah3

我可以先从 table1 中获取字符串,然后执行 foreach 并执行更多查询以从 table2 中获取限制 3。但这似乎对性能没有好处。

这样的查询会是什么样子?

【问题讨论】:

  • 可以发一下创建表的SQL吗?

标签: php mysql


【解决方案1】:

我不知道它是否适用于 MySQL,但在 MSSQL 中是这样的

选择 table1.string, 表2.info FROM table1 INNER JOIN table2 ON table2.stringID = table1.ID WHERE ROW_NUMBER() OVER (PARTITION BY table1.string ORDER BY table2.info)

【讨论】:

    【解决方案2】:

    你可以试试这个(虽然不是很快):

    SELECT string,info FROM
    (
      select t1.string, t2.info, 
      @n_rec := IF(@tmp!=t1.string,1,@n_rec+1) as nrec, 
      @tmp := t1.string
      FROM 
      table_1 t1
      INNER JOIN  table_2 t2 ON t2.table_1_id = t1.id 
      order by t1.string
     )yy
     INNER JOIN (SELECT @n_rec := 0) X
     INNER JOIN (SELECT @tmp:= null)Y  
     WHERE nrec <=3;
    

    如果您需要包含 table_1 中的记录而 table_2 中没有信息,您可能想要使用 LEFT JOIN table_2 而不是 INNER JOIN table_2

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 2013-07-11
      • 2018-01-21
      • 2014-02-01
      • 2012-08-19
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      相关资源
      最近更新 更多