Ответы пользователя по тегу MySQL
  • Join таблиц из 2 бд yii2?

    Ninazu
    @Ninazu
    $query = "SELECT 
    						t1.AdId, 
    						t1.City 
    					FROM butuzLOCAL.product AS t1 
    						JOIN statistic.user_2 AS t2 ON t1.AdId = t2.AdId
    					WHERE t2.date = :dttm";
    
    $results = Yii::$app->db
        ->createCommand($query)
        ->bindValues([
            'dttm'=>'2019-11-12'
        ])
        ->queryAll();
    Ответ написан
    2 комментария
  • Как правильно выполнить запрос mysql с INNER JOIN с большими базами?

    Ninazu
    @Ninazu
    Проще двумя запросами. Подзапросы и джоин сам на себя не советую если база большая и индексы не расставлены или более сложная логика присутсвует вроде (показать картинку последнего продукта).
    Вытащить все категории, потом вытащить по одному продукту для каждой через IN
    Либо вариант второй, денормализировать, и хранить картинку категории в категории

    P.S. Если всё же захотите через INNER JOIN, то не забудьте индекс на image добавить, и я бы делал не пустую строку а NULL

    SELECT
        p.product_id,
        p.image
    FROM oc_product_to_category c
        INNER JOIN oc_product p ON p.product_id = c.product_id
            AND p.image IS NOT NULL
    WHERE c.id_categor = :categoryId
    LIMIT 1
    Ответ написан
    Комментировать
  • Вывод недостающих дат?

    Ninazu
    @Ninazu
    Ну тогда в вашей денормализации есть смысл.

    Сложно понять структуру вашей базы по вашему куску кода. Поэтому код пишу наугад)

    1. Нужно сформировать весь возможный диапазон дат на PHP
    $period = new DatePeriod(
         new DateTime('2019-01-21'),
         new DateInterval('P1D'),
         new DateTime('2019-01-28')
    );
    
    $dates = [];
    
    foreach($period as $date){
       $dates[] = $date->format("Y-m-d"); 
    }


    2. Получаем цены которые уже есть в базе для товаров
    $where = " WHERE p.date IN ('" . implode(",'", $dates) . "')";


    3. Построить cписок недостающих цен по массиву $dates и продуктам с их ценами.
    $data[$product][$price][] = $date;
    ////.......
    foreach($data[$product][$price] as $datesInDb){
         $missing = array_diff($dates, $datesInDb);
    }


    4. Добавить недостающие записи для продуктов
    INSERT IGNORE INTO prices (columns)
    VALUES (valueList),
          (valueList),
          ...
    Ответ написан
  • Как правильно сделать выборку из БД?

    Ninazu
    @Ninazu
    <?php
    
    #region DB Connection
    
    $dbName = "test";
    $dbHost = "127.0.0.1";
    $dbUser = "root";
    $dbPassword = "";
    $dbCharset = 'UTF8';
    $connection = new PDO("mysql:host={$dbHost};dbname={$dbName};charset={$dbCharset}", $dbUser, $dbPassword);
    
    #endregion
    
    #region Pagination
    
    $limit = empty($_GET['limit']) ? 10 : ((int)$_GET['limit']);
    $offset = empty($_GET['page']) ? 0 : (($_GET['page'] - 1) * $limit);
    
    #endregion
    
    #region GetTypes
    
    $query = "	SELECT
    				`id`,
    				`type`
    			FROM `type`";
    $result = $connection
    	->query($query)
    	->fetchAll(PDO::FETCH_ASSOC);
    $types = array_combine(array_column($result, 'id'), array_column($result, 'type'));
    
    #endregion
    
    #region GetVIIII
    
    $query = "	SELECT
    				`id`,
    				`added_date`,
    				`title`,
    				`type`
    			FROM `viiii` 
    			ORDER BY `id`
    			LIMIT {$offset},{$limit}";
    
    $result = $connection
    	->query($query)
    	->fetchAll(PDO::FETCH_ASSOC);
    
    #region Render
    
    $output = "<table>";
    
    foreach ($result as $row){
    	$typeList = explode(',',$row['type']);
    	$typeList = array_intersect_key($types, array_flip($typeList));
    	$threatType = implode(", ", $typeList);
    	$output.="	<tr>
    					<td>{$row['added_date']}</td>
    					<td>{$row['title']}</td>
    					<td>{$threatType}</td>
    				</tr>";
    }
    
    $output.= "</table>";
    
    echo $output;
    
    #endregion


    Но я бы рекоммендовал вам хранить тип в смежной таблице. В будущем будет меньше проблемм.
    Ответ написан
    Комментировать
  • Как правильно фильтровать входящие данные?

    Ninazu
    @Ninazu
    Да. Вы указываете whiteList всё остальное будет игнорироваться.

    P.S. кстати можно не указывать верхний регистр, если используете флаг /i, и е находится между а-я))

    /^[а-я ]+$/iu
    Ответ написан
    Комментировать
  • Как выбрать записи по условию из разных таблиц, при условии существования хотя бы в одной из них?

    Ninazu
    @Ninazu Автор вопроса
    А как потом мне обьединить результаты этих двух запросов? И отсортировать эти результаты?
    Думал как-то через UNION, но что-то не получается
    Ответ написан
    Комментировать