За последние 24 часа нас посетили 54110 программистов и 1665 роботов. Сейчас ищут 957 программистов ...

Единый запрос в Msql или while - жить или не жить

Тема в разделе "PHP для новичков", создана пользователем PARROt, 7 дек 2020.

  1. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Доброй ночи, Кодеры :)
    В базе две таблицы, количество полей и строк не совпадает.
    Надо - либо написать 1 объеденный запрос в базу, либо заставить цикл вывести в таблицу данные из двух таблиц.
    Что сделала: Пыталась и то и это, в итоге сдаюсь. Если у кого то есть мысли умные, жду. PS:Не программист я, просто балуюсь эпизодически, раз в 10 лет.
    По отдельности все работает, но с выводом в одну таблицу большие проблемы.

    Код (Text):
    1. $sql1=$mi->query("SELECT `name`,`img`,`text` FROM `lunab`  WHERE `id` IN (".$n.",".$n1.",".$n2.",".$n3.",".$n4.",".$n5.",".$sum.") ORDER BY RAND()");
    2. $sql2=$mi->query("SELECT `txt`  FROM `lunat` ORDER BY `id` DESC");
    3.    
    4.  
    5. // Вывод результатов
    6. echo '<table border=1>';
    7. while ($row = mysqli_fetch_assoc($sql1) && $row1 = mysqli_fetch_assoc($sql2))
    8. {
    9. echo '<tr>';
    10. echo '<td valign=top>Карта '.$row['name'].'<br>'.$row['img'].'</td><td  height=330px>'.$row['text'].'</td></tr><tr>';
    11. echo '<td  height=330px>'.$row1['txt'].'</td></tr><tr>';
    12. }
    13.  
    14. echo "</table>";
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Давайте примеры таблиц.
    И что из них нужно вывести.
     
    PARROt нравится это.
  3. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Код (Text):
    1.    таблица "lunab" 36 записей
    2.     1    id Первичный    int(10)        UNSIGNED         AUTO_INCREMENT    
    3.     2    name    varchar(1024)    utf8_general_ci    
    4.     3    img    varchar(1024)    utf8_general_ci      
    5.     4    text    varchar(1024)    utf8_general_ci      
    Код (Text):
    1.  таблица "lutab" - 7 записей
    2.     1  id   int(10)        UNSIGNED        AUTO_INCREMENT        
    3.     2    txt    varchar(1024)    utf8_general_ci
    1. Получаем данные из формы: день и месяц рождения, складываем день+мес, получаем число.
    2. Делаем запрос в базу получаем количество записей кроме полученного числа.
    3. Дальше из полученного запроса генерим 6 случайных чисел (возможно эту конструкцию можно привести в короткий цикл)
    Код (Text):
    1. $sql=$mi->query("SELECT COUNT(id) FROM ".$table." WHERE id !=".$sum."");
    2. $count_records = mysqli_fetch_row($sql);
    3. $count_records = $count_records[0];
    4.  
    5. $n= rand(0,$count_records);
    6. $n1= rand(0,$count_records);
    7. $n2= rand(0,$count_records);
    8. $n3= rand(0,$count_records);
    9. $n4= rand(0,$count_records);
    10. $n5= rand(0,$count_records);
    И далее делаем уже запрос на вывод.
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Требуется уточнение.
    Таблицы имеют что-то общее? ID например. Или совпадение имен колонок случайны?
    Было бы понятнее со структурой и примерами значений.
    По поводу случайных чисел.
    Они должны быть все разные?
     
    PARROt нравится это.
  5. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Таблицы общего не имеют.
    Случайные 6 разных кроме того числа что мы получаем по дате рождения, как пример 12 мая=12+5=$карта личности
     

    Вложения:

  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Тогда та часть вашего кода, где вы получаете шесть случайных чисел будет работать не совсем так, как вам нужно.
    Ладно.
    Подумаю над вашей задачей.
    Чуть позже дам решение.
     
    PARROt нравится это.
  7. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Спасибо, жду.
     
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    В общем рассмотрев возможность всё сделать одним запросом, решено от такого решения отказаться.
    Ввиду излишней длины запроса.
    Следующий запрос выдаст все возможные соединения строк обеих таблиц в случайном порядке.
    Код (Text):
    1. SELECT `lunab`.*, `lutab`.*
    2. FROM `lunab` , `lutab`
    3. WHERE lunab.`id` !=17
    4. ORDER BY RAND()
    Осталось отфильтровать их необходимое количество в отдельный массив.
    Справитесь?
     
    PARROt нравится это.
  9. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Честно говоря не делала такого раньше, но попытаюсь найти как это сделать. Поняла, что 2 таблицу чтобы не сортировать, ей нужно переназначить id ключи, дабы ее вообще не сортировать.
    Правильно ли я понимаю сам запрос: Мы выбираем все из обеих таблиц с условием кроме переменной которая к нам пришла из сложения дата+месяц и сортируем.
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Правильно.
    Создайте пустой массив и обрабатывая выборку, подсчитывайте в нем количество элементов.
    Одновременно сравнивая строку на соответствие требованию.
    Если соответствует, то заносите в массив. Предварительно проверив отсутствие этого ID в нем, если есть - пропускайте строку..
    Как только массив заполнится прерывайте цикл.
     
    PARROt нравится это.
  11. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Добр! Дальше объявления пустого массива дело не пошло.
    Код (Text):
    1. $sql1=$mi->query("SELECT `lunab`.`name`,`lunab`.`img`,`lunab`.`text`, `lunat`.`txt` FROM `lunab`,`lunat`
    2. WHERE lunab.`id`=".$sum." ORDER BY RAND()");
    3. $keyArray=array();
    4. function array_fill_keys($keyArray, $sql1) {
    5.     if(is_array($keyArray)) {
    6.         foreach($keyArray as $key => $value) {
    7.             $filledArray[$value] = $sql1[$key];
    8.         }
    9.     }
    10.     return $filledArray;
    11. }
     
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Хорошо.
    Обрабатывайте выдачу из базы как готовую.
    Потом скопируйте сюда код - я добавлю фильтр.
     
    PARROt нравится это.
  13. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Я вообще задумалась над тем, а правильно ли я задачу поставила, смысл выводить 7 позиций, если нужна одна из 7 и комментарий к ней, но комментарий должен быть исходя из того в какой из 7 позиций выпала карта бизнесмена.
    Пыталась себе упростить задачу, воспользовавшись только запросом в базу соединенных двух таблиц, но то из одной таблицы появлялось куча дублей из-за того что не было связки в ИД, потом вроде добилась правильного вывода из 1 таблицы, а из второй печатается только одна запись. Вроде задача простая, а не получается.
    Код (Text):
    1. $sql1=$mi->query("SELECT `lunab`.`name`,`lunab`.`img`,`lunab`.`text`, `lunat`.`txt` FROM `lunab`,`lunat` WHERE `lunab`.`id` IN (".$n.",".$n1.",".$n2.",".$n3.",".$n4.",".$n5.",".$sum.")= `lunat`.`id` GROUP BY `lunab`.`id`");
    2. echo '<table border=1>';
    3. while ($row = mysqli_fetch_assoc($sql1))
    4. {
    5. echo '<tr>';
    6. echo '<td><b>Карта '.$row['name'].'</b></td>';
    7. echo '</tr>';
    8. echo '<tr>';
    9. echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>';
    10. }
    11.  
    12. echo '</table>';
    Причем попытка чтения ни к чему кроме каши в голове не приводит. Надо как-то упростить задачу, чтобы я могла это понять и сделать сама.
     
  14. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Я не тороплю.
    Пока вот фильтр для предыдущего запроса
    PHP:
    1. $cntrl = array();
    2. echo '<table border=1>';
    3. while ($row = mysqli_fetch_assoc($sql1))
    4. {
    5. if(count($cntrl) > 6) break;
    6.  
    7. if(!in_array($row['id'], $cntrl))
    8.   {
    9.    $cntrl[] = $row['id'];
    10.    echo '<tr>';
    11.    echo '<td><b>Карта '.$row['name'].'</b></td>';
    12.    echo '</tr>';
    13.    echo '<tr>';
    14.    echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>';
    15.    }
    16. }
    17.  
    18. echo '</table>';
    Только добавьте в SELECT `lunab`.`id`
     
    PARROt нравится это.
  15. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Спасибо вам в любом случае! Сейчас все выводится, дублей нет, но теряется то что приходит из формы.
    И выборка из второй таблицы должна выводится как она есть от 1 до 7 без рандома. Соответственно если я пока просто вас копирую, толку от меня нет.
    Код (Text):
    1. <?
    2. if (isset($_POST['num1']) && isset($_POST['num2'])){
    3. $num1=($_POST['num1']);//день рождения
    4. $num2=$_POST['num2'];//месяц рождения
    5.  
    6. $sum=$num1+$num2;//складываем день и месяц
    7. //echo $sum;//если полученное больше заданного
    8. $total=36;//Заданное число
    9. if ($sum<=$total){
    10. echo "<table><tr><td>Карта личности - $sum</td></tr></table>";
    11. } else if ($sum>$total){
    12. while (1)
    13. {
    14. $sum -= $total;
    15. if ( $sum > 0 && $sum < 37 ) { break; }
    16. }
    17. $sum = sprintf($sum);
    18. echo "<table><tr><td>Карта личности - $sum</td></tr></table>";//то что пришло нам из формы и то что теряется в итоге
    19. }
    20. echo "</td></tr><tr><td valign=top>";//дальше вывод в котором мне нужно обязательно разобраться как оно работает, чтобы я могла его изменять, а не отвлекать вас.
    21. $sql1=$mi->query("SELECT `lunab`.*, `lunat`.* FROM `lunab` , `lunat` WHERE lunab.`id` !=".$sum." ORDER BY RAND()");
    22. $cntrl = array();
    23. echo '<table border=1>';
    24. while ($row = mysqli_fetch_assoc($sql1))
    25. {
    26. if(count($cntrl) > 6) break;
    27.  
    28. if(!in_array($row['id'], $cntrl))
    29.   {
    30.    $cntrl[] = $row['id'];
    31.    echo '<tr>';
    32.    echo '<td><b>Карта '.$row['name'].'</b></td>';
    33.    echo '</tr>';
    34.    echo '<tr>';
    35.    echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>';
    36.    }
    37. }
    38. echo '</table>';
    39. }
    40. ?>
     
  16. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    То есть не должна повторяться?
    На каком этапе?
     
    PARROt нравится это.
  17. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Выборка из lunat в ней 7 строк, которые должны выводится от 1 до 7 в неизменном виде, сейчас выводится рандомом.
    С выборкой и выводом из lunab все отлично, но карта личности не выводится на экран вообще.
    т.е. карта личности которая приходит из формы должна оказаться в выборке в любом поле из 7 карт.
    Посмотреть тут: https://isida.online/tes1.php
     
  18. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Код (Text):
    1. $cntrl = array();//создаем пустой массив
    2. echo '<table border=1>';
    3. while ($row = mysqli_fetch_assoc($sql1))
    4. {
    5. if(count($cntrl) > 6) break;//count — Подсчитывает количество элементов массива, если массив больше 6 то останавливаем выборку
    6. if(!in_array($row['id'], $cntrl))//in_array -- Проверяем, присутствует ли в массиве значение по id то что пришло из базы, и то чем мы наполнили
    7.   {
    8.    $cntrl[] = $row['id'];//наполненный массив теперь будет равен тем значениям которые мы получили из базы - дальше вывод
    9.    echo '<tr>';
    10.    echo '<td><b>Карта '.$row['name'].'</b></td>';
    11.    echo '</tr>';
    12.    echo '<tr>';
    13.    echo '<td valign=top>'.$row['img'].'</td><td><b>'.$row['text'].'</b><br>'.$row['txt'].'</td></tr><tr>';
    14.    }
    15. }
    16. echo '</table>';
    Мы в запросе просили выбрать все значения из базы кроме значения $sum (то что приходит из формы, чтобы оно не попалось), теперь ее каким то волшебным способом надо добавить в вывод на экран, причем перемешать с остальными полученными и вывести из 2 таблицы согласно id jn 1-7.
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Выгрузите мне обе таблицы в .sql (phpMyAdmin > экспорт).
     
    PARROt нравится это.
  20. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    выгрузила
     

    Вложения:

    • 1.zip
      Размер файла:
      5,7 КБ
      Просмотров:
      2
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Ближе к ночи напишу.
     
    PARROt нравится это.
  22. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Хорошо, не горит :)
     
  23. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    PHP:
    1. <?php
    2.  
    3. $link = mysqli_connect("bd_host", "user", "password", "db_name");
    4. mysqli_set_charset($link, 'utf8');
    5.  
    6. $sql = "SELECT `lunab`.*, `lunat`.`id` AS `tid`, `lunat`.`txt`
    7. FROM `lunab` , `lunat`
    8. ORDER BY RAND()";
    9.  
    10. $sum = 17; // сумма чисел из формы
    11.  
    12. $cntrl     = array();
    13. $cntrl2    = array();
    14. $bd_result = array();
    15. $bd_append = array();
    16.  
    17. if ($query_result = mysqli_query($link, $sql))
    18. {
    19.  
    20.      while ($row = mysqli_fetch_assoc($query_result))
    21.      {
    22.      if($row['id'] != $sum
    23.         && !in_array($row['id'], $cntrl)
    24.         && !in_array($row['tid'], $cntrl2)
    25.         && count($cntrl) < 6)
    26.         {
    27.          $cntrl[]     = $row['id'];
    28.          $cntrl2[]    = $row['tid'];
    29.          $bd_result[] = $row;
    30.         }
    31.  
    32.      if($row['id'] == $sum)
    33.         {
    34.          $bd_append[] = $row;
    35.         }
    36.      }
    37.  
    38. }
    39.  
    40. foreach($bd_append as $result_append)
    41. {
    42. if(!in_array($result_append['tid'], $cntrl2))
    43. $bd_result[] = $result_append;
    44. }
    45.  
    46. shuffle($bd_result);
    47.  
    48. echo '<pre>';
    49. print_r($bd_result);
    50.  
    51. ?>
     
    PARROt нравится это.
  24. PARROt

    PARROt Новичок

    С нами с:
    3 дек 2020
    Сообщения:
    24
    Симпатии:
    2
    Адрес:
    Санкт-Петербург
    Доброе утро! В каких случаях нужно задавать новое имя полям или таблицам при выборке из базы?
     
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Если нужно к ним обратиться например.
    Или объединить, для таблиц.
    В вашем случае, если второй колонке не дать псевдоним, она заместит первую при извлечении из объекта в ассоциативный массив..
     
    #25 Drunkenmunky, 11 дек 2020
    Последнее редактирование: 11 дек 2020