Lipetsk *nix Association Forum Lipetsk *nix Association Forum
Новости:
 
*
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
27 Ноября 2024, 12:27:27


Войти


Страниц: [1]   Вниз
  Печать  
Автор Тема: как сделать сложный mysql запрос  (Прочитано 21356 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« : 26 Мая 2008, 14:07:10 »

везде в инете описано что делать надо так (простая выборка столбцов):


my $sth = $dbh->prepare("SELECT * from test");
$sth->execute();

while (my $ref = $sth->fetchrow_hashref()) {print "$DATE->{'DATE'} $TIME->{'TIME'} $CALLED_DN->{'CALLED'} $CALLING_DN->{'CALLING'} $RELEASE_->{'relese'} <br>\n";};}
$sth->finish();

$DATE->{'DATE'}--как я понял это связывание значения переменной со столбцом таблицы типа если совпало то выводим хотя могу ошибаться не нашел путного обьяснения даже в родной справке.

причем вывод имеет вид

ххххххх
хххххххххххх
ххххххххх
ххххххххх
ххххххххххххх
ххххххх




но как модифицировать приведенный ниже кусок:
(то есть чтобы была выборка по условию WHERE причем чтобы в WHERE еще и работали условия: >=   и   <= )

$dbh->do("SELECT 1DATE, 1TIME, CALLING_DN, CALLED_DN, RELEASE_ from test WHERE CALLED_DN=\"$called\" AND CALLING_DN=\"$calling\" AND 1TIME>=\"$begintime\" AND 1TIME<=\"$endtime\" AND 1DATE>=\"$begindate\" AND 1DATE<=\"$enddate\"; ") };
« Последнее редактирование: 26 Мая 2008, 15:12:18 от wrag » Записан

живущий в консоли
начальник отдела системотехники Люцифеp
all
Небритый одмин
*****

Карма: 2
Сообщений: 730


Windows Vista Power Pack 2008)))


Награды
« Ответ #1 : 26 Мая 2008, 16:38:57 »

ну на сколько я знаком с перлов то у него енсть 3 типа доступа к данным из запроса:
fetchrow_array
fetchrow_arrayref
fetchrow_hashref
(что значат посмотрите в мануале лень описывать).

при создании сложных хапросов с переменными прдлогаю использовать конкнтенацию текстровых строк:
например $a."sdbjkdbgkjsdf".$b
а не простую вставку переменных (меньше потом ошибок вылезет)

{'CALLING'} это поле БД полученное с помощью fetchrow_hashref.

и потом у вас запрос неработает или выводит непонятно что?

PS и еще пока нетт опыта работы с запросами поставте себе phpmyadmin и выполняйте sql запрос там потом нажните на кнопку php код (он подходит для перла) и в него уже вставте свои переменные

« Последнее редактирование: 26 Мая 2008, 16:43:01 от all » Записан

all-all-blog.blogspot.com - мысли о пингвинах, паяльниках и др. интересной хрени.
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #2 : 27 Мая 2008, 11:21:48 »

в общем описываю ситуацию
у меня юникс на нем прел апач и майскуль все работает совместно

возникла проблема никак не удаеться вывести данные в HTML из perl сложный запрос к mysql базе
собственно сам запрос внизу первого поста
                 а вот как реализовать это пока не нашел поэтому прошу кто в курсах как сие реализовать откликнитесь
Записан

живущий в консоли
начальник отдела системотехники Люцифеp
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #3 : 27 Мая 2008, 11:28:28 »

ну на сколько я знаком с перлов то у него енсть 3 типа доступа к данным из запроса:
fetchrow_array
fetchrow_arrayref
fetchrow_hashref
(что значат посмотрите в мануале лень описывать).

ну про это написано в мане но как то вскользь
fetchrow_array  Возвращает следующую запись как массив 
fetchrow_arrayref  Возвращает следующую запись как ссылку на массив 
fetchrow_hashref  Возвращает следующую запись как ссылку на хеш 
fetchall_arrayref  Возвращает всю информацию как массив массивов 

fetchrow_array
Этот метод выбирает очередную строку данных и возвращает ее как массив значений полей. Пример:
while(@row = $sth -> fetchrow_array) {
print qw($row[0]\t$row[1]\t$row[2]\n);
}

fetchrow_arrayref
Этот метод выбирает очередную строку данных и возвращает ссылку на массив значений полей. Пример:
while($row_ref = $sth -> fetchrow_arrayref) {
print qw($row_ref ->
  • \t$row_ref -> [1]\t$row_ref ->
  • [2]\n);
    }

    fetchrow_hashref
    Этот метод выбирает строку данных и возвращает ссылку на хеш, содержащий пары имя/значение. Данный метод намного менее эффективен, чем использование пописанных выше ссылок на массивы. Пример:
    while($hash_ref = $sth -> fetchrow_hashref) {
    print qw($hash_ref -> {firstname}\t$hash_ref ->
    {lastname}\t$hash_ref ->{title}\n);
    }

    fetchall_arrayref
    Этот метод выдает все данные (все строки), получаемые как результат SQL-запроса. Он возвращает ссылку на массив ссылок на массивы отдельных строк. Соответственно, для обращения к этим данным нужно использовать вложенный цикл. Пример:
    my $table = $sth -> fetchall_arrayref
    or die "$sth -> errstr\n";
    my($i, $j);
    for $i ( 0 .. $#{$table}} ) {
    for $j ( 0 .. $#{$table -> [$i]} )  {
    print "$table -> [$i][$j]\t";
    }
    print "\n";
    }

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

    например:
    qw($row_ref ->
  • \--кусочек который мне не ясен

что за qw? а дальше что есть что? где строка? где переменная? где столбец?
ну и в том же плане разобрать все остальное
Записан

живущий в консоли
начальник отдела системотехники Люцифеp
all
Небритый одмин
*****

Карма: 2
Сообщений: 730


Windows Vista Power Pack 2008)))


Награды
« Ответ #4 : 27 Мая 2008, 12:15:14 »

ye qw - это просто ) она создает массив из строки типа (1 2 3 4), где разделитель, в данном случае пробел.

далее

qw($hash_ref -> {firstname} \t $hash_ref ->{lastname} \t $hash_ref ->{title} \n);

эта строка создает тип массива и выводит его (ИМХО бред для меня) - qw тут только для дальнейщей обработки.

ЗЫ php есть на сервере? если есть то через 5 мин код напишу)
« Последнее редактирование: 27 Мая 2008, 12:19:22 от all » Записан

all-all-blog.blogspot.com - мысли о пингвинах, паяльниках и др. интересной хрени.
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #5 : 28 Мая 2008, 16:18:34 »

есть
то есть ты можеш написать скрипт на пхп чтобы он выводил из базы по сложному запросу на хтмл страницу результат? ?

просто то что удалось в конце концов сделать выводит запрос но появилась проблемма при выводе размер страницы получился под 40 метров Шокирован
« Последнее редактирование: 28 Мая 2008, 16:21:07 от wrag » Записан

живущий в консоли
начальник отдела системотехники Люцифеp
NeO
Злобный админчик
Администратор
*****

Карма: 62
Сообщений: 2376

Debian Stretch


WWW Награды
« Ответ #6 : 28 Мая 2008, 17:18:06 »

просто то что удалось в конце концов сделать выводит запрос но появилась проблемма при выводе размер страницы получился под 40 метров Шокирован
Добавь "LIMIT x,y" к запросу. Где х - номер первого выводимого элемента, у - номер последнего выводимого элемента.
Записан
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #7 : 31 Мая 2008, 16:01:06 »

в общем я так понял что для сборки динамического сложного запроса надо собрать сначала строку которая будет вставлена после слова where

проверяем длину переменных затем собираем часть строки с одной переменной
если такая не поступила то зануляем ее чтоб не мешалась
с другими переменными тоже составляем часть строки по аналогии
 
if (length($calling) > 3) {$s1="CALLING_DN="."%"."$calling"."%"}  else {$s1=""};
if (length($called) > 3) {$s2="and "."CALLED_DN="."%"."$called"."%"}  else {$s2=""};
if (length($begindate) > 8 ) {$s3="and "."DATE>="."$begindate"}  else {$s3=""};
if (length($enddate) >  8 ) {$s4="and "."DATE<="."$enddate"}  else {$s4=""};
if (length($begintime) > 8 ) {$s5="and "."TIME>="."$begintime"}  else {$s5=""};
if (length($endtime) > 8 ) {$s6="and "."TIME<="."$endtime"}  else {$s6=""};

собираем строку
$where=$s1.$s2.$s3.$s4.$s5.$s6;
проверяем что у нас собралось
print $where;

выполняем запрос к базе
my $query = "SELECT 1DATE, 1TIME, CALLING_DN, CALLED_DN, RELEASE_ from observ WHERE \"$where\" ";
Записан

живущий в консоли
начальник отдела системотехники Люцифеp
young
Юзверь
**

Карма: 0
Сообщений: 53


SlackWare 12.2, CentOS 5.1, FreeBSD 6.2


Награды
« Ответ #8 : 07 Июля 2008, 15:46:21 »

SELECT 1DATE, 1TIME, CALLING_DN, CALLED_DN, RELEASE_ from test WHERE CALLED_DN=\"$called\" AND CALLING_DN=\"$calling\" AND 1TIME>=\"$begintime\" AND 1TIME<=\"$endtime\" AND 1DATE>=\"$begindate\" AND 1DATE<=\"$enddate\

попробуй для начала дать этот запрос в консоли mySQL, будешь прятно удивлен, что он не работает...
SELECT a, b, c, d FROM ctable WHERE e > 12 GROUP BY a;

и еще в догонку... Таблицы в базе с большой/ большими буквами не называют...
Записан

wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #9 : 25 Июля 2008, 16:03:20 »

ну так конечно не заработает в кавычках переменные которые еще получить надо:)
\"$чтототам\" -переменная перловая
Записан

живущий в консоли
начальник отдела системотехники Люцифеp
MAG
Небритый одмин
*****

Карма: 14
Сообщений: 850


Android 4.2, Virtual_Machine


WWW Награды
« Ответ #10 : 25 Июля 2008, 17:39:36 »

wrag

Вообще что требуется? Проверь сами требования. А то у тебя получается много условий "И"...

попробуй для начала дать этот запрос в консоли mySQL, будешь прятно удивлен, что он не работает...
SELECT a, b, c, d FROM ctable WHERE e > 12 GROUP BY a;

GROUP BY здесь не подойдет...

и еще в догонку... Таблицы в базе с большой/ большими буквами не называют...

Создаются и еще как!
И все прекрасно работает (а если в книге видишь надпись "нельзя!" - выкини книгу, и попробуй сперва БД поболе написать на SQL - поймешь)
Записан
wrag
Небритый одмин
*****

Карма: 0
Сообщений: 673



Награды
« Ответ #11 : 26 Июля 2008, 09:34:31 »

не условий в самый раз
да и вобщем все работает как нельзя лучше
осталось только проиндексировать столбцы в таблице
Записан

живущий в консоли
начальник отдела системотехники Люцифеp
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM