[sql] Вопросы по БД

Discussion in 'PHP' started by FraiDex, 25 Feb 2008.

Thread Status:
Not open for further replies.
  1. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    ОФФ.
    есть такой литератур "Самоучитель MYSQL 5" Кузнецова и Симдянова это мастхав.
    Гениальная книжка. По соотношению полезность:цена самая полезная и самая дешевая. Там 99% закрывают вопросов, которые сюда постят.

    ЗЫ. Я думаю вопросы здесь в основном от незнания SQL :(
     
  2. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    Code:
    $list = query("SELECT DISTINCT country FROM stats WHERE sid = 2 and country != ''")
    foreach( $list as $country ) {
       SELECT count(country) FROM stats WHERE sid = 2 and country = '{$country}'
    }
    
    Из первого запроса, получаю список активных стран, второй запрос служит для определения количества записей по той или иной страны, вопрос состоит в том, можно ли сделать проще, а то запросов уж много получается в цикле...
     
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    shellz[21h]
    Code:
    SELECT country, count(country) FROM stats WHERE sid=2 and country!='' GROUP BY country
     
    _________________________
    1 person likes this.
  4. restart05

    restart05 New Member

    Joined:
    20 Feb 2012
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Как можно оптимизировать данный запрос ?

    SELECT DISTINCT h.`map`,h.`pl`,m.`mpl` FROM `hist` as h, (SELECT max(`pl`) as `mpl`, `map` FROM `hist` GROUP by `map`) m WHERE h.`map`=m.`map` and h.`pl`=m.`mpl` ORDER by m.`mpl` DESC LIMIT 10

    Данный запрос выводит из таблицы 10 максимальныx значений pl

    Заранее спасибо!
     
  5. Qwert321

    Qwert321 Banned

    Joined:
    25 Jan 2009
    Messages:
    33
    Likes Received:
    0
    Reputations:
    0
    Есть таблица : table
    =======================================
    | id(int) | name(varchar) | list(varchar) |
    =======================================
    | 1 | Product | abc,cba,123,12:23:44 |
    =======================================

    как прибавить в колонку list новую строку, не считываю до этого SELECT-ом (SELECT list FROM table), а на UPDATE-е?

    вот запрос:
    INSERT INTO `table` (`name`,`list`) VALUES ('$name', '$list') ON DUPLICATE KEY UPDATE `list`= [и вот тут как-то можно манипулировать? типо `list` + '$new_line']

    а может как-то и select можно применить внутри ?
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Я чего-то не понимаю, или то что вы делаете подзапросом - как раз то, что вам нужно?

    Code:
    SELECT `map`, max(`pl`) as `mpl` FROM `hist` GROUP BY `map` ORDER BY `mpl` DESC LIMIT 10
    Qwert321 concat() испольуйте

    Code:
    INSERT INTO `table` (`name`,`list`) VALUES ('$name', '$list') ON DUPLICATE KEY UPDATE `list`= concat(`list`, 'new_line')
     
    _________________________
  7. FindeR

    FindeR Elder - Старейшина

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    Nightmarе, считать итерации и сравнивать с mysql_num_rows($result) ?
     
  8. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    if (!$row) {break;}
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Nightmarе Ваш исходный код и так останавливается, когда все строки обработаны. Хотя если быть совсем точным, то следует делать так:
    PHP:
    $result=mysql_query("SELECT * from users");
    while((
    $row=mysql_fetch_assoc($result))!==FALSE)

    тут выводятся данные в цикле
    }
    mironich код, внутри ваших фигурных скобок никогда не выполнится, остановка произойдет раньше
     
    _________________________
  10. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    А сразу после цикла написать:?)
     
  11. FindeR

    FindeR Elder - Старейшина

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    Так что в моём варианте не устраивает?

    PHP:
    $result=mysql_query("SELECT * from users");
    $i 0;
    while((
    $row=mysql_fetch_assoc($result))!==FALSE)

    тут выводятся данные в цикле
    if ($i++ == mysql_num_rows($result))
    {
      echo 
    'Конец';
    }
    }  
     
  12. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    mysql_num_rows?
     
  13. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Мб так?

    PHP:
    do 
    {
      if (
    $rec mysql_fetch_assoc($res)) {

      } else {
         echo(
    'Конец...');
      }
    }  while (
    $rec)
     
    1 person likes this.
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Nightmarе
    PHP:
    $result=mysql_query("SELECT * from users");
    if (
    mysql_num_rows($result) > 0)
    {
    while(
    $row=mysql_fetch_assoc($result))

    тут выводятся данные в цикле
    }

    echo 
    'Все записи выведены';

    } else {echo 
    'Записей нет';}
    Не могли бы вы вообще сразу формулировать, что хотите
     
    _________________________
    2 people like this.
  15. qaz

    qaz Elder - Старейшина

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    хто может нормально своими словами обьснить что делает функция NAME_CONST()
    какое её предназначение?
     
  16. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Возможно както оптимизировать данный запрос?
    Code:
    SELECT DISTINCT  `t1`.`left_key`,`t1`.`right_key`,`t1`.`blog_id`,`t1`.`level`
           FROM `wp_wnm_blogs_tree` AS `t1` , `wp_wnm_blogs_tree` AS `t2`
            WHERE `t2`.`blog_id` IN (1,38,37,36,35,33)  
              AND (`t1`.`left_key` >= `t2`.`left_key` AND `t1`.`right_key` <= `t2`.`right_key`
                   AND (`t1`.`level` <= 
    (SELECT `t3`.`level` FROM `wp_wnm_blogs_tree` AS `t3` WHERE `t3`.`blog_id` IN (1,38,37,36,35,33) ORDER BY `t3`.`level` LIMIT 1) + 1 
    )) AND `t1`.`blog_id` IN (1,38,37)
            ORDER BY `t1`.`left_key`
    
     
    #1676 Doom123, 13 Apr 2012
    Last edited: 13 Apr 2012
  17. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Ошибок в таблицах нет?
    t1, t2, t3 алиасы одной и тоже таблицы - wp_wnm_blogs_tree
    Зачем сравнивать "сам с собой"?
    Дальше "маневры" and'ами мусорные телодвижения.
    ИМХО это даже будет показывать тоже что и "оригинал":
    Code:
    SELECT DISTINCT  `t1`.`left_key`,`t1`.`right_key`,`t1`.`blog_id`,`t1`.`level`       
    FROM `wp_wnm_blogs_tree` AS `t1`
    WHERE `t1`.`blog_id` IN (1,38,37,36,35,33)
    ORDER BY `t1`.`left_key`
     
  18. 0o Chris o0

    0o Chris o0 New Member

    Joined:
    16 Oct 2011
    Messages:
    142
    Likes Received:
    1
    Reputations:
    0
    Сравнение в бд стоит cp1251_general_ci, если писать ручками, то все нормально, но если вводить данные скриптом:
    PHP:
    <?php
        $dir 
    "dir";   //задаём имя директории
        
    if(is_dir($dir)) {   //проверяем наличие директории
             
    echo $dir.' - директория существует;<br>';
             
    $files scandir($dir);    //сканируем (получаем массив файлов)
             
    array_shift($files); // удаляем из массива '.'
             
    array_shift($files); // удаляем из массива '..'
    $host 'localhost';
    $user 'root';
    $pass '';
    $db 'dbname';
     if (!(
    mysql_connect($host$user$pass))) die ('MySQL connection error');
     if (!(
    mysql_select_db($db))) die ('There is no such database');
        foreach (
    $files as $values) {         //выводим все файл
                
    $pos strpos($values".");
                
    $values substr($values0$pos);
                echo 
    $values "<br>";
                
    $query "INSERT INTO users (name, rate) values ('$values', 400);";
                if(!
    mysql_query($query)) {
                  die (
    'Error');
                }
                echo 
    "Data was added successfully<br>";
             }
        }
        else echo 
    $dir.' -такой директории нет;<br>';

     
    ?>
    То возникают проблемы с кодировкой(выводятся ???), как можно исправить?
     
  19. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    не совсем... мне нужны строки с минимальным `level` тоесть там level моет быть 2,5,3,4,8
    а мне нуже только строки с минимальным лэвэлом .. тоесть level = 2
    а манипуляции с эндами тоже не просто так.. это выбор всех дочерних веток в дереве ...
    это таблица дерева..
     
  20. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Code:
    SELECT DISTINCT t1.left_key, t1.right_key, t1.blog_id, t1.level
    FROM 
     (SELECT * FROM wp_wnm_blogs_tree WHERE blog_id IN (1,38,37,36,35,33)) AS t1,
     (SELECT MIN(level) AS mini FROM wp_wnm_blogs_tree WHERE blog_id IN (1,38,37,36,35,33)) AS t2
    WHERE t1.level=t2.mini
    ORDER BY t1.left_key;
    
    так мэйби :)
     
Thread Status:
Not open for further replies.