0
id    title
--------------------------
1     mysql websites
2     html tips
3     mysql tricks
4     javascript tutorial
5     mysql queries
6     javascript framework

複数の行の関連記事を選択し、それらを id でグループ化して、1 つのクエリにまとめたいと考えています。それは可能ですか?

何かのようなもの

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 フレームワーク')
    }
}

編集:

私がそれをしている理由は、 void にしたいから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 回繰り返されます。

4

2 に答える 2

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 を使用する場合に機能します。

于 2012-11-16T16:35:48.570 に答える
0

あなたが求めているのはこれに似たものですか?

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

于 2012-11-16T15:33:35.340 に答える