MySQL выбирает связанные данные для нескольких строк в одном запросе

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

Я хочу выбрать связанные статьи для нескольких строк и сгруппировать их по идентификатору в одном запросе. Это возможно?

что-то типа

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

и результат был бы

array
(
    // result for id = 1
    0 => array
    (
        0 => array (id => 1, title => 'mysql websites'),
        1 => array (id => 3, title => 'mysql tricks'),
        2 => array (id => 5, title => 'mysql queries')
    ),

    // result for id = 4
    1 => array
    (
        0 => array (id => 4, title => 'javascript tutorial'),
        1 => array (id => 6, title => 'javascript framework')
    }
}

редактировать:

Я делаю это потому, что хочу аннулировать 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 раз, как я могу обойти это?


person user1643156    schedule 16.11.2012    source источник
comment
У вас есть id IN(1,4), но все ваши обнадеживающие результаты имеют все идентификаторы... Я не понимаю.   -  person Dave    schedule 16.11.2012


Ответы (2)


Это ужасный способ делать вещи, но я считаю, что это то, что вы ищете: 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, потому что а) вас интересует только сопоставление первого слова, и б) вы хотите сопоставить первое слово в любом месте заголовка в другие записи.

MySQL не может создать индекс для таких запросов, как %cheese%, индексы FULLTEXT и поиск могут работать для cheese%, особенно если вы используете BOOLEAN MODE.

person Jon    schedule 16.11.2012

Это что-то похожее на это, что вам нужно?

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

person Jack    schedule 16.11.2012
comment
результат тот, что я ожидал. но я хочу сделать это в пределах one query. кроме того, ключевые слова неизвестны, предоставлены только идентификаторы. Я хочу использовать заголовок CURRENT_ROW в качестве ключевого слова. - person user1643156; 16.11.2012