【问题标题】:MySQL selecting related data for multiple rows in one queryMySQL在一个查询中为多行选择相关数据
【发布时间】:2012-11-16 15:05:43
【问题描述】:
id    title
--------------------------
1     mysql websites
2     html tips
3     mysql tricks
4     javascript tutorial
5     mysql queries
6     javascript framework

我想为多行选择相关文章,并按 id 对它们进行分组,在一个查询中。这可能吗?

类似

SELECT
    id, title
FROM
    articles
WHERE
    title LIKE (TITLE_OF_CURRENT_ROW)
    AND id IN (1,4)
GROUP BY
    id;

结果是

数组
(
    // id = 1 的结果
    0 => 数组
    (
        0 => 数组(id => 1,标题 => 'mysql 网站'),
        1 => 数组(id => 3,标题 => 'mysql 技巧'),
        2 => 数组(id => 5,标题 => 'mysql 查询')
    ),

    // id = 4 的结果
    1 => 数组
    (
        0 => 数组(id => 4,标题 => 'javascript 教程'),
        1 => 数组(id => 6,标题 => 'javascript 框架')
    }
}

编辑:

我这样做的原因是因为我想取消queries inside loop。例如,我正在生成 100 行并将它们保存到文件中。

$result = $mysql->query("SELECT id, title FROM articles LIMIT 100");

while($row = $result->fetch_assoc()) {

    $related_result = $mysql->query("SELECT id, title FROM articles WHERE title LIKE '%".$row['title']."%' AND id != ".$row['id']);

    // while... get related data

    save_data_to_file($row['id'], $row['title'], $related['ids'], $related['titles']);
}

上面的相关查询会重复100次,我该怎么走?

【问题讨论】:

  • 你有id IN(1,4),但你希望的结果有所有的ID......我不关注。

标签: mysql select correlated-subquery


【解决方案1】:

这是一种可怕的做事方式,但我相信这就是您正在寻找的:http://sqlfiddle.com/#!2/53465/8

SELECT
    articles.id,
    articles.title,
    related.id as rel_id,
    related.title as rel_title
FROM
    articles
LEFT JOIN
  articles AS related
ON
  related.title LIKE CONCAT('%', SUBSTRING_INDEX(articles.title, ' ', 1), '%')
AND    # update: this needs to be AND, not WHERE
  related.id != articles.id
ORDER BY
  articles.title, related.title

它可怕的原因是 MySQL 不能使用恰好位于 title 上的任何索引,因为 a) 你只对匹配第一个单词感兴趣,并且 b) 你想匹配任何索引中的第一个单词标题在其他条目中的位置。

MySQL 无法为 %cheese% 等搜索创建索引,FULLTEXT 索引和搜索可以为 cheese% 工作,尤其是在您使用 BOOLEAN MODE 时。

【讨论】:

    【解决方案2】:

    你是不是和这个类似?

    http://sqlfiddle.com/#!2/15414/11

    【讨论】:

    • 结果如我所愿。但我想在one query 内完成。此外,关键字是未知的,只提供了 id。我想使用 CURRENT_ROW 的标题作为关键字。
    猜你喜欢
    • 2023-03-11
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2022-01-18
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多