За последние 24 часа нас посетили 19196 программистов и 1643 робота. Сейчас ищут 904 программиста ...

обеденение двух запросов в один (SQL)

Тема в разделе "PHP и базы данных", создана пользователем Dante5, 4 авг 2015.

  1. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    как объединить данное условие в один так как выводить только одну запись а должно все которых нет во второй таблице
    данный код выводит только одну запись,а в базе 4 записи должно вывести три так как в таблице history есть запись об одном из 4 сайтов . как объединить эти два запроса чтобы выводились остальные записи

    Код (PHP):
    1. $USER = $_SESSION["user"];
    2. $ZALOBA = 25;
    3.  
    4. $TIMEOFF = time()-60*60*24;
    5.  
    6. $stmt = $PDO->prepare("SELECT * FROM asp_ads WHERE status=? and zaloba<? ORDER BY vip DESC");
    7. $stmt->execute(array(1,$ZALOBA));
    8. $stmt->setFetchMode(PDO::FETCH_LAZY);
    9. while($SQLUSER = $stmt->fetch())
    10. {
    11.     $stmt = $PDO->prepare("SELECT * FROM `asp_ads_history` WHERE `id_site`=? and user=? and timeserf>?");
    12.     $stmt->execute(array($SQLUSER->id,$USER,$TIMEOFF));
    13.     $stmt->setFetchMode(PDO::FETCH_LAZY);
    14.     $SQLSyte = $stmt->fetch();
    15.     if($SQLSyte==false)
    16.     {
    17.         echo '<table width="95%" border="0" cellspacing="0" cellpadding="0" align="center">';
    18.             echo '<tr>';
    19.                 echo '<td colspan="4" id="marg">';
    20.                     echo $SQLUSER->url;
    21.                     echo '<hr class="style-three" />';
    22.                 echo '</td>';
    23.             echo '</tr>';
    24.         echo '</table>';
    25.     }
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    А что было на месте знаков вопроса?
    Как эти таблицы между собой связаны? По каким атрибутам?
    Составной запрос выполняется через оператор LEFT JOIN (RIGHT JOIN)
     
  3. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    вмето знаков вопроса подставляются значения из
    Код (PHP):
    1. array(1,$ZALOBA) 
     
  4. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Дайте структуру таблиц asp_ads и asp_ads_history
    И на всякий случай напишите по каким атрибутам они связаны
     
  5. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    необходимо чтобы из первой таблицы не выводило запись (id) который соответствует WHERE `id_site`=(id с первой страницы) and user=(из сесии) and timeserf> (из переменно)

    Добавлено спустя 6 минут 38 секунд:
    Код (PHP):
    1. DROP TABLE IF EXISTS `asp_ads`;
    2. CREATE TABLE `asp_ads` (
    3.   `id` int(11) NOT NULL AUTO_INCREMENT,
    4.   `url` varchar(150) NOT NULL,
    5.   `status` int(1) NOT NULL,
    6.   `zaloba` int(20) NOT NULL,
    7.   PRIMARY KEY (`id`),
    8.   KEY `id` (`id`)
    9. ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=cp1251;
    10.  
    11.  
    12.  
    13. DROP TABLE IF EXISTS `asp_ads_history`;
    14. CREATE TABLE `asp_ads_history` (
    15.   `id` int(255) NOT NULL AUTO_INCREMENT,
    16.   `id_site` int(255) DEFAULT NULL,
    17.   `user` varchar(200) DEFAULT NULL,
    18.   `timeserf` int(255) DEFAULT NULL,
    19.   PRIMARY KEY (`id`)
    20. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    Добавлено спустя 1 минуту 33 секунды:
    id и id_site они связаны между собой
     
  6. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Код (PHP):
    1. SELECT A1.id, A1.url, A1.status, A1.zaloba, A2.user, A2.timeserf, A2.id as history_id
    2. FROM asp_ads as A1
    3. LEFT JOIN (asp_ads_history as A2)
    4. ON (A1.id = A2.id_site)
    5. WHERE A1.status=? and A1.zaloba<? and  A2.user=? and  A2.timeserf>? ORDER BY ?????????? DESC
    Только что за атрибут vip - я не понял. В таблицах его нет
     
  7. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    $ZALOBA = 25;
    ну сортировка по випу щас не обязательно должно еще присутствовать zaloba<$ZALOBA

    Добавлено спустя 44 секунды:
    ой сори не заметил что присутсвует
     
  8. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Сортировки не будет по атрибуту, которого нет ни в одной таблице.
     
  9. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    сделал так ни че вобще не выводи
    Код (PHP):
    1. $USER = $_SESSION["user"];
    2. $ZALOBA = 25;
    3.  
    4. $TIMEOFF = time()-60*60*24;
    5.  
    6. $stmt = $PDO->prepare("SELECT A1.id, A1.url, A1.status, A1.zaloba, A2.user, A2.timeserf, A2.id as history_id FROM asp_ads as A1 LEFT JOIN (asp_ads_history as A2) ON (A1.id = A2.id_site) WHERE A1.status='1' and A1.zaloba<'".$ZALOBA."' and  A2.user=".$user." and  A2.timeserf>".$TIMEOFF."");
    7.     
    8. $stmt->execute();
    9. $stmt->setFetchMode(PDO::FETCH_LAZY);
    10. while($SQLUSER = $stmt->fetch())
    11. {
    12.         echo '<table width="95%" border="0" cellspacing="0" cellpadding="0" align="center">';
    13.             echo '<tr>';
    14.                 echo '<td colspan="4" id="marg">';
    15.                     echo $SQLUSER->url;
    16.                     echo '<hr class="style-three" />';
    17.                 echo '</td>';
    18.             echo '</tr>';
    19.         echo '</table>';
    20. }
    21.  
    Добавлено спустя 1 минуту 45 секунд:
    Код (PHP):
    1. DROP TABLE IF EXISTS `asp_ads`;
    2. CREATE TABLE `asp_ads` (
    3.   `id` int(11) NOT NULL AUTO_INCREMENT,
    4.   `url` varchar(150) NOT NULL,
    5.   `vip` varchar(1) NOT NULL DEFAULT '0',
    6.   `status` int(1) NOT NULL,
    7.   `zaloba` int(20) NOT NULL,
    8.   PRIMARY KEY (`id`),
    9.   KEY `id` (`id`)
    10. ) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=cp1251;
    11.  
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну а агрегаты как же?
     
  11. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Их точно тут нет)))

    Добавлено спустя 1 минуту 49 секунд:
    Dante5
    Выполни мой запрос для начала в командной строке. Без условия и сортировки
    Если там всё ок , то уже надо пилить твой php-код
     
  12. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    о заработало но не так как надо выводит то чо находится в обоих таблицах а надо на оборот если в asp_ads_history есть то не выводить ав выводить те которых нет в asp_ads_history A2.user=? and A2.timeserf>?
    то есть если в asp_ads_history даже если есть A2.id_site но не совпадает A2.user="сесия узера " и так далее
     
  13. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Чтобы мне это понять - надо увидеть как было изначально всё без знаков вопросов
    Хотя... начинаю понимать...
     
  14. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    надо чтобы показывало список сайтов тех которые не подходят по условию в таблице истории как то так щас получается наоборот показывает только те которые есть в историии и у них совпадает условие

    Добавлено спустя 2 минуты 30 секунд:
    вот оно работает но на надо выборку на оборот что бы была

    Код (PHP):
    1. $USER = $_SESSION["user"];
    2. $ZALOBA = 25;
    3. $TIMEOFF = time()-60*60*24;
    4.  
    5.  
    6. $stmt = $PDO->prepare("SELECT A1.id, A1.url, A1.status, A1.zaloba, A2.user, A2.timeserf, A2.id as history_id FROM asp_ads as A1 LEFT JOIN (asp_ads_history as A2) ON (A1.id = A2.id_site) WHERE A1.status=? and A1.zaloba<? and  A2.user=? and  A2.timeserf>?");
    7.     
    8. $stmt->execute(array(1,$ZALOBA,$USER,$TIMEOFF));
    9.  
    10. $stmt->setFetchMode(PDO::FETCH_LAZY);
    11. while($SQLUSER = $stmt->fetch())
    12. {
    13.         echo '<table width="95%" border="0" cellspacing="0" cellpadding="0" align="center">';
    14.             echo '<tr>';
    15.                 echo '<td colspan="4" id="marg">';
    16.                     echo $SQLUSER->url." = ".$SQLUSER->id;
    17.                     echo '<hr class="style-three" />';
    18.                 echo '</td>';
    19.             echo '</tr>';
    20.         echo '</table>';
    21. }
    22.  
     
  15. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Когда в условии есть фраза "кроме тех которые..." можно делать так: делаем под-запрос, возвращающий id и в родительском запросе указываем
    Код (PHP):
    1. ... WHERE id NOT IN(...подзапрос...) 
     
  16. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    допустим есть 4 записи в таблице
    Код (PHP):
    1. INSERT INTO `asp_ads` VALUES ('3','www.test.net','1', '2', '23');
    2.  
    3. INSERT INTO `asp_ads` VALUES ('4','www.test1.net','1', '2', '12');
    4. INSERT INTO `asp_ads` VALUES ('5','www.test2.net','1', '2', '11');
    5. INSERT INTO `asp_ads` VALUES ('6','www.test3.net','1', '2', '14');
    и одна в asp_ads_history
    Код (PHP):
    1. NSERT INTO `asp_ads_history` VALUES ('2', '3', 'slawon245', '1438693358');
    необходимо вывести http://www.test3.net' так как их нет в таблице asp_ads_history

    Добавлено спустя 12 минут 56 секунд:
    в принципе даеже если они будут но с другим юзером тоже чтобы показывались
     
  17. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    select url from asp_ads where id not in(
    select distinct id_site from asp_ads_history
    )
     
  18. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    куда это вписать или что заменит в этом запросе
    Код (PHP):
    1. "SELECT A1.id, A1.url, A1.status, A1.zaloba, A2.user, A2.timeserf, A2.id as history_id FROM asp_ads as A1 LEFT JOIN (asp_ads_history as A2) ON (A1.id = A2.id_site) WHERE A1.status=? and A1.zaloba<? and  A2.user=? and  A2.timeserf>?"
    2.  
     
  19. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    У меня получилось как то так. Может чего напутал... Проверьте сначала в командной строке заменив знаки вопросов
    Код (PHP):
    1. SELECT * FROM asp_ads WHERE status=? and zaloba<? 
    2. AND IF((SELECT COUNT(*) FROM `asp_ads_history` WHERE asp_ads_history.id_site = asp_ads.id and user=? and timeserf>?)>0, 0, 1)
    3. ORDER BY vip DESC
    Совет на будущее - совместить эти две таблицы в одну.
    Добавить поле "История" со значениями 1 или 0.
    Есть правила для проектирования баз данных. Как я понял связь между Вашими таблицами 1:1
     
  20. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    совместить как если юзеры в истории могут быть разные

    Добавлено спустя 2 минуты 41 секунду:
    проверил пока что устраивает кажись как надо работает

    Добавлено спустя 2 минуты 23 секунды:
    спасибо огромное форум бомба лишних сообщений ноль только полезная помощь
     
  21. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    А при чем тут юзеры - вы это поле, как и остальные переносите в первую таблицу.

    Вы мои догадки лучше подтвердите или опровергните:
    в таблице asp_ads_history не более 1й записи где asp_ads_history.id_site = asp_ads.id?
     
  22. Dante5

    Dante5 Новичок

    С нами с:
    25 янв 2015
    Сообщения:
    26
    Симпатии:
    0
    не все юзерам будут доступны некоторые ссылки притом что и дата тоже будет влият на то когда ему ее показать

    Добавлено спустя 3 минуты 38 секунд:
    и в таблице asp_ads_history будет много записей к примеру тотже Ид но уже с другим юзером и датой
     
  23. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Поле `timeserf` int(255) DEFAULT NULL, - это дата?
    Все атрибуты в одну таблицу.
    Если есть еще какая-то зависимость, по которой некоторые атрибуты не могут быть в одной таблице - их в другую. Но я вижу, что тут можно слить всё воедино без проблем.
    Это нужно, чтоб правильно построить(упростить) логику запросов (Этот запрос показывает, что структура БД хромает) и логику приложения.
    Не просто так дядьки пишут учебники по БД.
    Найдите метод проектирования "Сущность - Связь", если всё будет понятно - посмотрите ещё метод нормальных форм(3х этапов в большинстве случаев достаточно).
    Это два основных метода проектирования структуры реляционной БД.
    Используйте любой - не прогадаете.