Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вложенный запрос с использованием like
 
 автор: maximum8   (24.06.2013 в 13:10)   письмо автору
326 байт
 
 

Здравствуйте, есть запрос в прикрепленном файле.

задумка такая, выводиться список документов, рядом с ними считается сколько документов связаных с текущим. Это значение содержится в поле field_value. В нем может быть через запятую указанно несколько значений. doc.Id - это id текущего документа для которого считается количество связанных документов. Хочу сделать одним запросом, так как суммарно документов много и гонять в цикле подсчёт связанных документов сильно накладно.

Проблема в том, что здесь like воспринимает %doc.Id% именно как doc.Id для поиска, а не подставляет номер текущего документа в выборке. Как то решить эту проблему можно?

// ps. Почему то если код из файлика опубликовать в топике, то получаю сообщение:
"К сожалению, сообщение не может быть размещено из-за содержащегося в нем URL-адреса, попробуйте переформулировать сообщение без него" - я не вижу адреса, на который система ругается)

  Ответить  
 
 автор: Sfinks   (24.06.2013 в 13:44)   письмо автору
 
   для: 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

  Ответить  
 
 автор: maximum8   (24.06.2013 в 15:19)   письмо автору
 
   для: Sfinks   (24.06.2013 в 13:44)
 

Сделал доп таблицу, так как при более 10 000 записей тормозить будет скорее всего. Спасибо за совет, не подумал над самым простым решением ;)

  Ответить  
 
 автор: maximum8   (24.06.2013 в 18:06)   письмо автору
 
   для: Sfinks   (24.06.2013 в 13:44)
 

таблицу я сделал, вопрос ещё назрел по поиску теперь. Если в итоге приходит массив вида

array(51,52,77,34);


как оптимальнее сделать поиск. Если гонять цикл и собирать кучу OR (value = '51') что по скорости будет, если таких параметров может быть около 50 штук?

  Ответить  
 
 автор: Sfinks   (24.06.2013 в 19:42)   письмо автору
 
   для: 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

  Ответить  
 
 автор: maximum8   (24.06.2013 в 22:30)   письмо автору
 
   для: Sfinks   (24.06.2013 в 19:42)
 

нет, я же написал, что этот запрос уже сделал, получил аналог вашего. Я уже спрашиваю по использование этой связки таблиц.

  Ответить  
 
 автор: maximum8   (24.06.2013 в 22:31)   письмо автору
 
   для: Sfinks   (24.06.2013 в 19:42)
 

другими словами, таблица уже заполнена, допустим мне нужно не количество посчитать, это же сделано, а выполнить поиск по таблице, ради этого в том числе всё это и делалось.

  Ответить  
 
 автор: Sfinks   (25.06.2013 в 11:20)   письмо автору
 
   для: maximum8   (24.06.2013 в 22:31)
 

> выполнить поиск по таблице
Ну так вы опишите поиск словами?... Поиск поиску рознь.
Пока могу сказать точно только одно: Поиск - это самая сильная сторона SQL! Поэтому я и не пойму, что вы там пытаетесь сделать с массивами, т.к. запросы нужно строить так, чтобы в PHP возвращался уже готовый результат, а не промежуточные итоги.

Еще раз говорю - опишите свой поиск словами.

  Ответить  
 
 автор: maximum8   (25.06.2013 в 12:02)   письмо автору
 
   для: Sfinks   (25.06.2013 в 11:20)
 

попробуй по другому)

смотрите, таблица выше у меня есть. Она заполнена результатами document_from и document_to. При ходят следующие данные в виде массива:


array(51,52,77,34);


мне нужно выбрать все записи, у которых document_to совпадает со значениями из массива. решение которое приходит первым:


SELECT *
        FROM " . PREFIX . "_document_link
        WHERE document_to = '51' OR document_to = '52'


и так далее. Но, в массиве может быть больше 10 или 30 значений. Другое решение есть?

  Ответить  
 
 автор: Sfinks   (25.06.2013 в 14:13)   письмо автору
 
   для: 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
Нет?

  Ответить  
 
 автор: maximum8   (25.06.2013 в 15:27)   письмо автору
 
   для: Sfinks   (25.06.2013 в 14:13)
 

нет, просто данные из формы с пачкой чекбоксов

  Ответить  
 
 автор: Sfinks   (25.06.2013 в 22:00)   письмо автору
 
   для: maximum8   (25.06.2013 в 15:27)
 

А, ну тада ладно =)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования