UNION

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

UNION

Непрочитанное сообщение ProFTP » 2009-07-31 10:22:45

Код: Выделить всё

SELECT id_se, 
                               name_se   
                         FROM section 

                   ORDER BY created desc 
                      LIMIT 2 )

                  UNION 

                  
                 (SELECT t1.id_co,
                              t1.text_cm
                       FROM comment AS t1

                ORDER BY t1.created desc 
                   LIMIT 2
почему данный запрос выводит:

Код: Выделить всё

$VAR1 = [
          [
            '71',
            'sdfsdf'
          ],
          [
            '70',
            '5555'
          ],
          [
            '12',
            '<p><strong>Как посмотреть список таблиц и их структуру в MySQL &#160;&#160;&#160;</strong><br /><br />SHOW DATABASES; - список баз данных<br />SHOW TABLES [FROM db_name]; -&#160; список таблиц в базе <br />SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице<br />SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"<br />SHOW INDEX FROM tbl_name; - список индексов<br />SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.<br /><br /><br />SHOW VARIABLES; - значения системных переменных<br />SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам<br />SHOW STATUS; - общая статистика<br />SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе</p>'
          ]
        ];
но вывел 3 записи, то есть во втором запросе получается LIMIT 1

другой выдает все нормально:

Код: Выделить всё

SELECT t1.id_co,
                              t1.text_cm
                       FROM comment AS t1
                ORDER BY t1.created desc 
                   LIMIT 2

Код: Выделить всё

$VAR1 = [
          [
            '12',
            '<p><strong>Как посмотреть список таблиц и их структуру в MySQL &#160;&#160;&#160;</strong><br /><br />SHOW DATABASES; - список баз данных<br />SHOW TABLES [FROM db_name]; -&#160; список таблиц в базе <br />SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице<br />SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"<br />SHOW INDEX FROM tbl_name; - список индексов<br />SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.<br /><br /><br />SHOW VARIABLES; - значения системных переменных<br />SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам<br />SHOW STATUS; - общая статистика<br />SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе</p>'
          ],
          [
            '12',
            '<p><strong>Как посмотреть список таблиц и их структуру в MySQL &#160;&#160;&#160;</strong><br /><br />SHOW DATABASES; - список баз данных<br />SHOW TABLES [FROM db_name]; -&#160; список таблиц в базе <br />SHOW COLUMNS FROM таблица [FROM db_name]; - список столбцов в таблице<br />SHOW CREATE TABLE table_name; - показать структуру таблицы в формате "CREATE TABLE"<br />SHOW INDEX FROM tbl_name; - список индексов<br />SHOW GRANTS FOR user [FROM db_name]; - привилегии для пользователя.<br /><br /><br />SHOW VARIABLES; - значения системных переменных<br />SHOW [FULL] PROCESSLIST; - статистика по mysqld процессам<br />SHOW STATUS; - общая статистика<br />SHOW TABLE STATUS [FROM db_name]; - статистика по всем таблицам в базе</p>'
          ]
        ];
всего у меня 4-5 таких запросов с LIMIT 2, я хотел объеденить их, правильно?

в чем проблема? в чем бред?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: UNION

Непрочитанное сообщение zingel » 2009-07-31 12:27:59

юзай DBI::Pg
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: UNION

Непрочитанное сообщение ProFTP » 2009-07-31 14:17:38

там надо написать UNION ALL вместо UNION
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Sla
мл. сержант
Сообщения: 73
Зарегистрирован: 2008-08-19 15:09:19

Re: UNION

Непрочитанное сообщение Sla » 2009-07-31 16:39:21

я тебе еще по секрету скажу

убери с первого селекта order by

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: UNION

Непрочитанное сообщение ProFTP » 2009-07-31 17:22:37

и как оно должно быть?

ты иммешь ввиду под оугмоу написать запрос?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Sla
мл. сержант
Сообщения: 73
Зарегистрирован: 2008-08-19 15:09:19

Re: UNION

Непрочитанное сообщение Sla » 2009-07-31 17:43:58

один в конце
Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: UNION

Непрочитанное сообщение ProFTP » 2009-07-31 17:47:31

Код: Выделить всё

   ( SELECT id_se, 
                                   name_se   
                             FROM section 
)

                      UNION 

                      
                     (SELECT t1.id_co,
                                  t1.text_cm
                           FROM comment AS t1

                    ORDER BY t1.created desc 
                       LIMIT 2
ok
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: UNION

Непрочитанное сообщение ProFTP » 2009-08-01 20:08:57

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

вот посомтрите правильно ли запросы стоят?

Код: Выделить всё

#########################################

my $time = time - 3600;

     my $sql = ' SELECT id, username,
               ( SELECT count(*) from sessions where expires >= '.$time.' or expires is null ) as count_users_on,
               ( SELECT count(*) from comment ) as count_comment,
               ( SELECT count(*) from content ) as count_content,
               ( SELECT count(*) from section ) as count_section,
               ( SELECT count(*) from users ) as count_users
                     FROM users ORDER BY id desc limit 1 ';
    
        my $dbh = $c->model('DBI')->dbh;
 
      my $sth = $dbh->prepare($sql);

           $sth->execute();
          
    my $loop_data = $sth->fetchrow_hashref();
    
    $sth->finish(); 

$loop_data->{username_top} = $loop_data->{username};
$loop_data->{username} = substr ($loop_data->{username}, 0, 16) if ( length($loop_data->{username}) > 16);

$c->stash($loop_data);


  ## section
  my $sql2;
          if ( $c->user_exists() == 0)  {
            $sql2 = 'LEFT JOIN section AS t4
                       ON t1.id_se = t4.id_se 
                       WHERE t1.hiden_g_co = 0
                        AND t1.active_se = 1
                        AND t4.hiden_g_co = 0
                        AND t4.active_se = 1';
            }
            
            if ( $c->user_exists() == 1 
                 && !$c->check_user_roles('moder_se')   ) {
            $sql2 = 'LEFT JOIN section AS t7
                                ON t1.id_se = t7.id_se 
                            WHERE (    t1.active_se = 1                     
                              OR t1.id_un = ' . $c->user->{user}->{id} . ')
                             AND (    t7.active_se = 1                     
                              OR t7.id_un = ' . $c->user->{user}->{id} . ')' ;                             
            }
            
             if ( $c->user_exists() == 1 
                 && $c->check_user_roles('moder_se')   ) {
            $sql2 = '';                             
            }  
  
###########============ 
                ## content
                
                my $sql;
                my @sql;
                
            if ($c->user_exists() == 0){
             $sql = 'LEFT JOIN section AS t5
                                ON t2.id_se = t5.id_se
                              WHERE t2.active_co = 1
                             AND t2.hiden_co = 0
                             AND t2.hiden_g_co = 0
                             AND t5.active_se = 1
                             AND t5.hiden_g_co = 0';
             }
             
            if (!$c->check_user_roles('moder_se') && $c->user_exists() == 1) {
            
             $sql = 'LEFT JOIN section AS t8
                                ON t2.id_se = t8.id_se  
                            WHERE (t8.active_se = 1                     
                              OR t8.id_un = ' . $c->user->{user}->{id} . ')                              
                             AND (( t2.hiden_co = 1 
                               AND t2.active_co = 1)  
                                 OR t2.id_un = ' . $c->user->{user}->{id} . ')';    
            
            } 
            
            if ($c->check_user_roles('moder_se') ) {            
            $sql = '';            
            }
            
           

#############=========
                ## comment
                 
                my $sql3;
            if ($c->user_exists() == 0) {

            $sql3 = ' LEFT JOIN content AS t9
                        ON t3.id_co = t9.id_co 

                             LEFT JOIN section AS t10                     
                        ON t3.id_se = t10.id_se 
                                               
                               WHERE t3.hiden_g_cm = 0 
                               AND t9.hiden_g_co
                               AND t9.hiden_co = 0
                               AND t9.active_co = 1

                             AND t10.active_se = 1
                      AND t10.hiden_g_co = 0
                               ';

            
            }
            

            if (!$c->check_user_roles('moder_se') && $c->user_exists() == 1) {

             $sql3 = 'LEFT JOIN content AS t11
                                  ON t3.id_co = t11.id_co

                             LEFT JOIN section AS t12                     
                                  ON t3.id_se = t12.id_se 
                                                 
                                     WHERE (( t11.hiden_co = 1 
                                AND t11.active_co = 1)  
                                  OR t11.id_un = ' . $c->user->{user}->{id} . ')
                                                              
                                     AND (t12.active_se = 1                     
                                 OR t12.id_un = ' . $c->user->{user}->{id} . ')';

            } 
            
            if ($c->check_user_roles('moder_se') ) {            
            $sql3 = '';            
            }            
            

     my $sql = '(SELECT t1.id_se, 
                               t1.name_se   
                         FROM section AS t1 
                        '.$sql2.'
                   ORDER BY t1.created desc 
                      LIMIT 2 )

                  UNION ALL
                  
                 (SELECT t2.id_co, 
                              t2.name_co 
                       FROM content AS t2
                       '.$sql.'
                ORDER BY t2.created desc 
                   LIMIT 2)
                       
                  UNION ALL
                  
                 (SELECT t3.id_co,
                              t3.text_cm
                       FROM comment AS t3
                       '.$sql3.'
                ORDER BY t3.created desc 
                   LIMIT 2)';
    
    
        my $dbh = $c->model('DBI')->dbh; 
      my $sth = $dbh->prepare($sql);
           $sth->execute(@sql);          
    my $loop_data = $sth->fetchall_arrayref();    
       $sth->finish(); 



# use Data::Dumper;
 

 # print Dumper($loop_data);


#$self->_stat_cut('content',);




# section
$c->stash->{new_section_all1} = length ($loop_data->[0]->[1]) > 30 ? substr($loop_data->[0]->[1], 0, 30) : $loop_data->[0]->[1];
my @len = split (/ /, $loop_data->[0]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_section_id1} = $loop_data->[0]->[0];
  $c->stash->{new_section_cut1} = $big ? join (' ', @len) : $loop_data->[0]->[1];  
### 
  $c->stash->{new_section_all2} = length ($loop_data->[1]->[1]) > 30 ? substr($loop_data->[1]->[1], 0, 30) : $loop_data->[1]->[1];
my @len = split (/ /, $loop_data->[1]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_section_id2} = $loop_data->[1]->[0];
  $c->stash->{new_section_cut2} = $big ? join (' ', @len) : $loop_data->[1]->[1];  
#end


# content
$c->stash->{new_content_all1} = length ($loop_data->[2]->[1]) > 30 ? substr($loop_data->[2]->[1], 0, 30) : $loop_data->[2]->[1];
my @len = split (/ /, $loop_data->[2]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id1} = $loop_data->[2]->[0];
  $c->stash->{new_content_cut1} = $big ? join (' ', @len) : $loop_data->[2]->[1];  
###  
$c->stash->{new_content_all2} = length ($loop_data->[3]->[1]) > 30 ? substr($loop_data->[3]->[1], 0, 30) : $loop_data->[3]->[1];
my @len = split (/ /, $loop_data->[3]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_content_id2} = $loop_data->[3]->[0];
  $c->stash->{new_content_cut2} = $big ? join (' ', @len) : $loop_data->[3]->[1];  
#end


# comment 
 if ($loop_data->[4]->[1]) { 
$c->stash->{new_comment_all1} = length ($loop_data->[4]->[1]) > 30 ? substr($loop_data->[4]->[1], 0, 30) : $loop_data->[4]->[1];
my @len = split (/ /, $loop_data->[4]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_comment_id1} = $loop_data->[4]->[0];
  $c->stash->{new_comment_cut1} = $big ? join (' ', @len) : $loop_data->[4]->[1]; 
 } 
###
 if ($loop_data->[5]->[1]) {
$c->stash->{new_comment_all2} = length ($loop_data->[5]->[1]) > 30 ? substr($loop_data->[5]->[1], 0, 30) : $loop_data->[5]->[1];
my @len = split (/ /, $loop_data->[5]->[1], 8 ); 
my $big;
foreach (@len) {
  if ( length ($_) > 16 ) {
   $big = 1;
      $_ = substr $_, 0, 16; 
      $_ = $_.'.. ';
  }
}
  $c->stash->{new_comment_id2} = $loop_data->[5]->[0];
  $c->stash->{new_comment_cut2} = $big ? join (' ', @len) : $loop_data->[5]->[1];
 }    
#end
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: UNION

Непрочитанное сообщение hizel » 2009-08-03 12:05:16

нипупа себе кошмары ты рожаешь :]
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: UNION

Непрочитанное сообщение ProFTP » 2009-08-03 20:05:24

ну так а что деать? :)

кстате, коменты забыл написать: в конце обрезаються длинные слова...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение