|
 326 байт |
|
| Здравствуйте, есть запрос в прикрепленном файле.
задумка такая, выводиться список документов, рядом с ними считается сколько документов связаных с текущим. Это значение содержится в поле field_value. В нем может быть через запятую указанно несколько значений. doc.Id - это id текущего документа для которого считается количество связанных документов. Хочу сделать одним запросом, так как суммарно документов много и гонять в цикле подсчёт связанных документов сильно накладно.
Проблема в том, что здесь like воспринимает %doc.Id% именно как doc.Id для поиска, а не подставляет номер текущего документа в выборке. Как то решить эту проблему можно?
// ps. Почему то если код из файлика опубликовать в топике, то получаю сообщение:
"К сожалению, сообщение не может быть размещено из-за содержащегося в нем URL-адреса, попробуйте переформулировать сообщение без него" - я не вижу адреса, на который система ругается) | |
|
|
|
|
|
|
|
для: maximum8
(24.06.2013 в 13:10)
| | Во-первых, LIKE (ну и REGEXP еще) - это самая наимедленнейшая операция SQL. Не стоит ею пользоваться, если в этом нет крайней необходимости.
Поэтому категорически рекомендую вам пересмотреть структуру БД.
Такие вещи реализуются созданием отдельной таблицы связей, в которой вы в первом столбце указываете id статьи, во втором - id связанной статьи, на каждую связь выделяется отдельная строка и тогда выборка по целочисленному индексу производится очень легко и непринужденно.
Во вторых, у вас в запросе чет слишком много лишнего.... скобок, алиасов, кавычек. Но это не принципиально. Просто не очень....
В третьих, если вы решите все-таки проигнорировать во-первых, то вот так:
SELECT document_title
, document_alias
, rubric_id
, Id
, document_parent
, ( SELECT COUNT(*)
FROM document_fields
WHERE field_value LIKE concat('%',doc.Id,'%')
AND rubric_field_id = 16
) as nums
FROM documents as doc
WHERE rubric_id = 6
AND document_status = '1'
ORDER BY document_title ASC
|
| |
|
|
|
|
|
|
|
для: Sfinks
(24.06.2013 в 13:44)
| | Сделал доп таблицу, так как при более 10 000 записей тормозить будет скорее всего. Спасибо за совет, не подумал над самым простым решением ;) | |
|
|
|
|
|
|
|
для: Sfinks
(24.06.2013 в 13:44)
| | таблицу я сделал, вопрос ещё назрел по поиску теперь. Если в итоге приходит массив вида
как оптимальнее сделать поиск. Если гонять цикл и собирать кучу OR (value = '51') что по скорости будет, если таких параметров может быть около 50 штук? | |
|
|
|
|
|
|
|
для: maximum8
(24.06.2013 в 18:06)
| | Вы словами опишите, что вы хотите сделать? А то чет я суть не уловил.
Если то, что вы пытались сделать в первом посте, то это также делается на уровне СУБД.
Предположим у нас есть таблица documents(doc_id,doc_title,doc_text) и таблица связей links(doc_id,linked_doc_id).
И мы хотим вывести doc_id, doc_title, doc_text и количество связанных документов.
Делается это так:
SELECT doc_id
, doc_title
, doc_text
, count( linked_doc_id )co
FROM documents
LEFT JOIN links USING( doc_id )
GROUP BY doc_id, doc_title, doc_text
| , либо
SELECT *
, ( SELECT count(*)
FROM links
WHERE doc_id=d.doc_id )co
FROM documents d
|
| |
|
|
|
|
|
|
|
для: Sfinks
(24.06.2013 в 19:42)
| | нет, я же написал, что этот запрос уже сделал, получил аналог вашего. Я уже спрашиваю по использование этой связки таблиц. | |
|
|
|
|
|
|
|
для: Sfinks
(24.06.2013 в 19:42)
| | другими словами, таблица уже заполнена, допустим мне нужно не количество посчитать, это же сделано, а выполнить поиск по таблице, ради этого в том числе всё это и делалось. | |
|
|
|
|
|
|
|
для: maximum8
(24.06.2013 в 22:31)
| | > выполнить поиск по таблице
Ну так вы опишите поиск словами?... Поиск поиску рознь.
Пока могу сказать точно только одно: Поиск - это самая сильная сторона SQL! Поэтому я и не пойму, что вы там пытаетесь сделать с массивами, т.к. запросы нужно строить так, чтобы в PHP возвращался уже готовый результат, а не промежуточные итоги.
Еще раз говорю - опишите свой поиск словами. | |
|
|
|
|
|
|
|
для: Sfinks
(25.06.2013 в 11:20)
| | попробуй по другому)
смотрите, таблица выше у меня есть. Она заполнена результатами document_from и document_to. При ходят следующие данные в виде массива:
мне нужно выбрать все записи, у которых document_to совпадает со значениями из массива. решение которое приходит первым:
SELECT *
FROM " . PREFIX . "_document_link
WHERE document_to = '51' OR document_to = '52'
|
и так далее. Но, в массиве может быть больше 10 или 30 значений. Другое решение есть? | |
|
|
|
|
|
|
|
для: maximum8
(25.06.2013 в 12:02)
| |
<?php
$a = array(51,52,77,34);
$sql = "SELECT *
FROM " . PREFIX . "_document_link
WHERE document_to IN(".implode(',',$a).")";
|
Тут вопрос у меня был в другом. А именно в:
> При ходят следующие данные в виде массива
Откуда они приходят? Подозреваю, что из какого-то еще запроса, вроде:
SELECT document_to FROM links WHERE document_from = 12
| Нет? | |
|
|
|
|
|
|
|
для: Sfinks
(25.06.2013 в 14:13)
| | нет, просто данные из формы с пачкой чекбоксов | |
|
|
|
|
|
|
|
для: maximum8
(25.06.2013 в 15:27)
| | А, ну тада ладно =) | |
|
|
|