Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PostgreSQL query

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я работаю с PostgreSQL и PHP, данные поступают из базы данных IMDB (около 4 миллионов фильмов), заархивированных в моей базе данных PostgreSQL
 
Я создал поисковую систему Ajax, которая возвращает результаты, это работает очень хорошо
 
проблема и в запросе,
Поскольку данные language, aka и addition связаны с movieid, title, year, imdbid
 
Таким образом, результаты дублируются
 
Затем запрос должен вернуть только один заголовок с сгруппированными данными
 
 
   
 
 

Код:
 
$query = "SELECT  
    movies.movieid,
    movies.title,
    movies.year,
    movies.imdbid,
    akatitles.language,
    akatitles.title as aka,
    akatitles.addition  
FROM
    movies
    INNER JOIN akatitles ON movies.movieid = akatitles.movieid  
WHERE
  (movies.year @@ plainto_tsquery('%" . $value . "%'))
  OR  
  (movies.title @@ plainto_tsquery('%" . $value . "%'))  
  OR  
  (akatitles.title @@ plainto_tsquery('%" . $value . "%'))";
 
 

 

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 00:09 11-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback
https://stackoverflow.com/questions/46143606/merging-multiple-rows-into-single-row-postgresql

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 00:41 11-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Это работает, но время исполнения «запроса» очень высокое 317,496 second
 
 
 
Без "string_agg (различный"  Время исполнения - 3.157 second
 
 

Код:
 
 
SELECT
    movies.movieid,  
    movies.title,  
    movies."year",  
    movies.imdbid,  
    string_agg(distinct akatitles.language, ',' order by akatitles.language) as langs,  
  string_agg(distinct akatitles.title, ',' order by akatitles.title) as aka,
  string_agg(distinct akatitles.addition, ',' order by akatitles.addition) as add
 
FROM
    movies
    INNER JOIN
    akatitles
    ON  
        movies.movieid = akatitles.movieid
WHERE
    movies.title @@ plainto_tsquery('the exorcist 1973')
    group by movies.movieid, movies.title
 

 
 
   
 
Добавлено:
Это работает очень хорошо, очень быстро, 3.179 second приблизительно
 
 

Код:
 
array_to_string(array_agg(distinct akatitles.language), ' , ') as lang,  
array_to_string(array_agg(distinct akatitles.title), ' , ') as aka,
array_to_string(array_agg(distinct akatitles.addition), ' , ') as add  
 

 
 
Я думаю, что другой «запрос» для ускорения исполнения нет
 
Код, взятый отсюда и оптимизирован с distinct
 
https://stackoverflow.com/questions/2560946/postgresql-group-concat-equivalent
 
 
 
 

Код:
 
 
SELECT
    movies.movieid,  
    movies.title,  
    movies."year",  
    movies.imdbid,  
--    akatitles."language",  
--    akatitles.title AS aka,  
--    akatitles.addition
 
         array_to_string(array_agg(distinct akatitles.language), ' , ') as lang,  
         array_to_string(array_agg(distinct akatitles.title), ' , ') as aka,
     array_to_string(array_agg(distinct akatitles.addition), ' , ') as add
 
    FROM
    movies
    INNER JOIN
    akatitles
    ON  
        movies.movieid = akatitles.movieid
WHERE
    movies.title @@ plainto_tsquery('the exorcist 1973')
    
    GROUP BY movies.movieid
 
 

 
Добавлено:
Mavrikii
 
Спасибо за помощь
 
 
Добавлено:
возвращаться,
Что -то не так в запросе, данные, взятые из таблицы "akatitle", разные
 
Запрос должен группироваться, но также ассоциироваться,
 
table akatitle
 
   
 
 
query
 
   

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 08:40 11-11-2022 | Исправлено: zagorisback, 08:42 11-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback

Цитата:
Я думаю, что другой «запрос» для ускорения исполнения нет

индексы, индексы, индексы
https://www.mongodb.com/docs/manual/indexes/
плюс изучать https://www.mongodb.com/docs/manual/reference/command/explain/
 

Цитата:
но также ассоциироваться

что значит "ассоциироваться"?
сами написали, объединить distinct, то есть уникальные результаты. любые дубликаты будут убраны.
если нужно связывать с языков, то это в принципе неправильно и нужно рассматривать объединение столбцов перед операциями над результатами. или не использовать distinct и сортировку.

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 08:01 12-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 

Цитата:
индексы, индексы, индексы  

 
И что это? Они не индексы?
 
   
 

Цитата:
если нужно связывать с языков

 
точный
 
 

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 08:49 12-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback

Цитата:
И что это? Они не индексы?

откуда мне знать что у вас и как? если выполняется медленно, значит или проблема с индексами, либо запрос неоптимальный - использовать explain и изучать.
 

Цитата:
точный

как и написал - distinct и order by перемешивают и удаляют дубликаты, поэтому так.

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 08:53 12-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 

Цитата:
как и написал - distinct и order by перемешивают и удаляют дубликаты, поэтому так.

 
Если бы я знал, как это сделать, я не писал здесь, чтобы попросить о помощи
 

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 09:56 12-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback

Цитата:
Если бы я знал, как это сделать

убрать их, как еще??
 
либо сделать два запроса - один для фильма, а второй - остальная инфа для него, после чего обработать сами строки так, как хочется

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 10:16 12-11-2022 | Исправлено: Mavrikii, 10:29 12-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Я удалил «язык» и «добавление» из результатов
Я положил их на карту фильма
остался в покое "альтернативный заголовок"
 
Спасибо за совет

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 12:03 12-11-2022
zagorisback



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 
 
Этот запрос работает, но вставая в таблицу, я сломаю свой цикл, поскольку он присутствует в одном запросе в начале
 
Обратите внимание на переменную, взятую из первого запроса
 
 

Код:
$movieid = $row->movieid;

 

Код:
 
 
<?php
 
$movieid = $row->movieid;
 
$query2 = "
SELECT
    
    akatitles.title as akas
    
FROM
    akatitles
    INNER JOIN movies ON movies.movieid = akatitles.movieid  
WHERE
    ( akatitles.movieid = ( $movieid ) )
         
   
";
   
$result2 = pg_query($query2) or die('Error message: ' . pg_last_error());
    
while ($fetch = pg_fetch_object($result2)) {
 
     
?>
 
<td class="text-center"><?php echo $fetch->akas . '<br>'; ?></td>
 
 

 
 
Я пытался собрать это вместе, но это не работает
 

Код:
<?php
 
   require_once("connettipg.php");
     
// query with like '%1976%'
 
//$query = "SELECT * FROM movies WHERE title like '%The Exorcist%'";
 
$_POST['input_movie']=trim($_POST['input_movie']);
$value = $_POST["input_movie"];
 
 
$query = "
SELECT  
    movies.*,
    directors.name AS director
    
FROM
    movies
    INNER JOIN akatitles ON movies.movieid = akatitles.movieid  
    INNER JOIN movies2directors ON movies.movieid = movies2directors.movieid
    INNER JOIN directors ON movies2directors.directorid = directors.directorid
    
    
WHERE
 
-- posizionare movies.imdib all'inizio per non generare errore di integer
 
    (movies.imdbid = ('$value'))
    --     OR
    (akatitles.title @@ plainto_tsquery('%" . $value . "%'))
         OR  
    (movies.title @@ plainto_tsquery('%" . $value . "%'))  
         OR  
    (directors.name @@ plainto_tsquery('%" . $value . "%'))
   
   
    IN (
   SELECT
    
    akatitles.title as akas
    
FROM
    akatitles
    INNER JOIN movies ON movies.movieid = akatitles.movieid  
WHERE
    akatitles.movieid = movies.movieid
)
    
   
  ";
   
   
   
    $result = pg_query($query) or die('Error message: ' . pg_last_error());
 
     
?>

Всего записей: 623 | Зарегистр. 05-05-2014 | Отправлено: 13:40 16-11-2022 | Исправлено: zagorisback, 13:42 16-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zagorisback
когда вы научитесь нормально вопросы задавать?
приводят структуру и что нужно, а не "догадайся из картинок что я хочу".
 

Всего записей: 15101 | Зарегистр. 20-09-2014 | Отправлено: 07:30 17-11-2022
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PostgreSQL query


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru