За последние 24 часа нас посетили 50911 программистов и 1738 роботов. Сейчас ищут 897 программистов ...

Объединение запросов mysql

Тема в разделе "PHP для новичков", создана пользователем lysosutrin, 25 июн 2012.

  1. lysosutrin

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

    С нами с:
    7 май 2012
    Сообщения:
    15
    Симпатии:
    0
    Можно ли объединить два похожих запроса в один:
    Код (Text):
    1.  
    2. $resultForValues = mysql_query("SELECT `value` FROM `values` WHERE `wordId` = {$wordId} AND `status` = 1 ORDER BY `id`");
    и
    Код (Text):
    1.  
    2. $resultForExamples = mysql_query("SELECT `example` FROM `examples` WHERE `wordId`={$wordId} AND `status` = 1 ORDER BY `id`");
    А потом в цикле проверять,
    Код (Text):
    1.  
    2. if(isset($rows['value'])) //actions for values...
    3. else //actions for examples
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что конкретно ты потом хочешь делать с полученными данными? а то из твоего ифа не понятно, зачем их объединять.
     
  3. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
  4. lysosutrin

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

    С нами с:
    7 май 2012
    Сообщения:
    15
    Симпатии:
    0
    Первый запрос берет все значения слова по его id (wordId), второй запрос берет все примеры по id слова. А потом так:
    Код (Text):
    1. $resultForValues = mysql_query("SELECT `value` FROM `values` WHERE `wordId` = {$wordId} AND `status` = 1 ORDER BY `id`");
    2.     $resultForExamples = mysql_query("SELECT `example` FROM `examples` WHERE `wordId`={$wordId} AND `status` = 1 ORDER BY `id`");
    3.    
    4.     while($rows = mysql_fetch_assoc($resultForValues))
    5.         $values .= "<li>{$rows['value']}</li>";
    6.        
    7.     while($rows = mysql_fetch_assoc($resultForExamples))
    8.         $examples .= "<li>{$rows['example']}</li>";
    9.    
    10.     return array($values, $examples);
    Я бы хотел сделать один запрос, а потом в цикле обработать и "расфасовать" точно также.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    т.е. эта мистическая колонка `id` в обеих таблицах, это не id строк в этих таблицах, а id некоего слова?
     
  6. lysosutrin

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

    С нами с:
    7 май 2012
    Сообщения:
    15
    Симпатии:
    0
    Нет, id это id строк. А wordId это id слова, к которому привязано значение или пример.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ORDER BY в обоих запросах с каким смыслом?

    Добавлено спустя 40 секунд:
    а, вкурил. несколько валюесов, несколько экзамплесов к каждому слову =) да
     
  8. lysosutrin

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

    С нами с:
    7 май 2012
    Сообщения:
    15
    Симпатии:
    0
    Да, вот так) Фух) Ну так, можно совместить?)
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да. можно =) не нужно только.
     
  10. lysosutrin

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

    С нами с:
    7 май 2012
    Сообщения:
    15
    Симпатии:
    0
    Будет хуже, медленнее?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А смысл какой? :)
    Сгруппируйте оба этих массива так чтобы ключами шло wordid. И перебирайте себе спокойно в цикле.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Объединение таблиц. Допускаем, что у некоторых value нет соответствующих example, поэтому left join.
    Если такие случаи невозможны/не нужны, замени на inner join:
    Код (PHP):
    1.     $result = mysql_query(
    2. "SELECT v.`wordId`, v.`value`, e.`example`
    3. FROM 
    4.   `values` AS v LEFT JOIN
    5.   `examples` AS e ON v.`worlId = e.`wordId AND e.`status` = 1
    6. WHERE 
    7.   v.`wordId` = {$wordId} AND v.`status` = 1 
    8. ORDER BY v.`id`, e.`id`");
    9.  
    Получишь объединенный набор где один value может повторяться с разными example. Потом в цикле отлавливай факт смены value

    Код (PHP):
    1. $old = '';
    2. while($row = mysql_fetch_assoc($result)) {
    3.   if ($row['value'] != $old) {
    4.     // ... здесь типа вывода шапки для группы value
    5.     $old = $row['value'];
    6.   }
    7.   // здесь типа вывод example
    8. }
    9.  
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    объединение ради объединения? Зачем забивать запрос дублированными данными, если заведомо известно, что эти таблицы между собой связаны только по номеру слова, и по факту, перебрать три массива в данном случае будет и читабельнее и проще?
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ты прав, я тоже так поступил, давно тоже страдал вложениями думал - это круто =))))

    А потом понял, что - это не надо =)))

    Сделал себе массив и парсинг и не замарачиваюсь )
    Все через шаблон делаю и все, там где необходимо, чтобы был запрос =)))

    Кучу сразу тоже не нужно, и по переходам страниц желательно, тоже все предыдущие скрывать, с другой страницы =)))
    А то замечал и такие скрипты где все запросы на главной :D только данные выдираются на разных страницах и разделах, ахаха.
    А потом в удивлениях, чтож так память то кушает блин! ;)
    Когда по 40 - 50 запросов на главной и "+" еще после них открытий других раделов =)))
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Полста запросов это сила. Но не в них беда. Можно достичь значительных ускорений для человека-посетителя засчет засовывания цссхи в тело каждой страницы, а js-скриптов после закрытия тега боди.