2015-06-28 5 views
1

Я пытаюсь получить результат запроса mysql за последние часы, но не получил его. Я надеюсь, что вы можете мне помочь.mySQL innerjoin, где условие не работает

У меня есть две таблицы. Первая таблица называется «дисками» и довольно большой с более чем 200000 строк и 30 столбцов и структурами, как:

plate | time from  | time to 
ab222 | 2015.05.12 08:00 | 2015.05.13 11:37 
cv481 | 2015.05.14 12:08 | 2015.05.14 14:11 

Вторым называется «топливом» и намного короче около 5000 строк, но и 22 столбцов , структура, которая, как:

plate | time    | amount | price 
ab222 | 2015.05.13 09:22 | 2.3 | 32.22 
cv481 | 2015.05.14 13:59 | 12.2 | 17.7 

Что я собираюсь сделать, это показать, для каждой строки в «топливе» таблицы права «диск». Это означает, что время таблицы «топливо» должно быть между «от времени» и «по времени» стола «приводов», и тарелка должна быть одинаковой. Результат должен показывать столбцы обеих таблиц (примерно 52 столбца и 5000 строк, потому что для каждой строки в таблице «топливо» должен быть один подходящий диск в таблице «диск»).

Я не привык работать с mysql, поэтому много искал и много пробовал. Следующая попытка, которую я сделал, кажется близкой к тому, что мне нужно:

INNER JOIN fuel.* ON 
drives.plate = fuel.plate 
WHERE fuel.time Between 
drives.timefrom AND 
drives.timeto 

но это не сработало.

***** UPDATE *****

Спасибо за вашу помощь до сих пор. Я играл с некоторыми запросами и заметил довольно странное поведение. Но прежде всего вы, ребята, были правы - я решил не использовать «JOIN», а запросить 2 таблицы и показать комбинированные результаты. Кажется, это лучшее решение.

Но теперь проблема. Когда я запрашиваю phpMyAdmin, результат верный, и он показывает некоторые совпадения. Но когда я передаю тот же запрос на php, он показывает ошибку.

Вот как я подключаюсь к своей базе данных. Это прекрасно работает:

$con = mysqli_connect("localhost","root","pass","test");  
mysqli_options($init, MYSQLI_OPT_LOCAL_INFILE, true);    

Вот запрос MySQL в PhpMyAdmin, который работает:

SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel.plate = drives.PLATE 
AND fuel.time BETWEEN drives.time from AND drives.time to 

Здесь же в PHP:

$con ­> query ("SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel 
plate = drives.PLATE AND fuel.time BETWEEN drives.time from AND  
drives.time to"); 

и это вызывает ошибку «Предупреждение : mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean задано ERROR 'в следующем кодовом блоке в первой строке:

<?php while($row=mysql_fetch_array($con))  {   ?>      <tr>      <td><p> 
<?php echo $row['product_id']; ?></p></td>      <td><p> 
<?php echo $row['product_name']; ?></p></td>      <td><p> 
<?php echo $row['cat_name']; ?></p></td>      </tr>   <?php  } ?>    

Я много гугл и нашел ответы, такие как переменная $ con - «null» или массив ошибочен. Но если я использую следующий запрос, чтобы импортировать файл CSV он работает:

$con­>query( "LOAD DATA LOCAL INFILE 'drives.csv' INTO TABLE  
rentals FIELDS TERMINATED BY '' ENCLOSED BY '\"' LINES  
TERMINATED BY '\r\n' IGNORE 1 LINES"); 

К сожалению, я не в состоянии получить мой запрос и показ результата рабочего. извините за раздражение, но не могли бы вы рассказать мне, что с этим не так? Большое спасибо.

***** ***** РАБОЧИЙ РАСТВОР

Я получил это работает. Мой запрос был неправильным.Вот работает один:

$blub = mysqli_query($con,"SELECT fuel.* , drives.* FROM fuel, drives 
WHERE fuel.plate = drives.PLATE AND fuel.time BETWEEN drives.time_from AND  
drives.time_to"); 
+0

Не работает средство? Это ошибки или что? – Rahul

+0

Я считаю, что его 'INNER JOIN fuel ON ....' Нет необходимости ** '*' ** –

+0

Просьба представить полный пример того, что вы ожидаете от строки, которая выглядит как – user2479930

ответ

1

Единственное, что наиболее явно не так с часть SQL, которую вы опубликовали, - это включение от .* нижеследующий таблица name.

В MySQL добавление/исключение ключевого слова INNER не влияет на оператор, то есть a INNER JOIN b является синонимом a JOIN b.

Предикаты могут появляться либо в предложении ON, либо в предложении WHERE. Учитывая, что предикаты представляют собой сопоставление столбцов в двух таблицах, это нечетно, чтобы разделить их на одно условие в предложении ON и другое условие в предложении WHERE. База данных не заботится о том, находятся ли эти условия в предложении ON или в предложении WHERE. Но поскольку оба условия, похоже, касаются «сопоставления» строк, имеет смысл (для меня), что они оба будут в предложении ON.

В качестве примера:

SELECT drives.plate 
     , drives.timefrom 
     , drives.timeto 
     , fuel.plate 
     , fuel.time 
     , fuel.amount 
     , fuel.price 
    FROM drives 
    JOIN fuel 
    ON fuel.plate = drives.plate 
    AND fuel.time BETWEEN drives.timefrom AND drives.timeto 

Followup

Вопрос: Запрос вызывает ошибки

SELECT fuel.* , drives.* FROM fuel, drives WHERE fuel.plate = drives.PLATE 
AND fuel.time BETWEEN drives.time from AND drives.time to 

А: вас есть паразитные пространства, где должен быть столбец имя без пробела

   BETWEEN drives.time from AND drives.time to 
           ^    ^

Если имя столбца имеет место в нем, вам нужно «бежать» имя столбца, заключая его в обратных кавычках:

   BETWEEN drives.`time from` AND drives.`time to` 
          ^  ^  ^ ^

Followup

Возможно, мой предыдущий пример было недостаточно ясно.

Заменить устаревший синтаксис запятой с JOIN ключевое слово

Это уже 2015. Прошло время до ditch синтаксис синтаксиса старой школы для операции соединения и заменить его новым ключевым словом JOIN. (Действительно ли это действительно справедливо для обозначения ключевого слова JOIN как «более нового»?)

Переместить предикаты из пункта WHERE в ON п

В базе данных на самом деле не заботится; это не влияет на внутреннее соединение, предикат является предикатом, является предикатом. Но мы обычно ставим предикаты, которые указывают, как строки должны быть «сопоставлены» в предложении ON, и помещают предикаты, которые фильтруют набор результатов в предложении WHERE.

Причина, по которой мы делаем это, заключается в том, что это делает проще для будущего читателя, чтобы расшифровать и понять, что делает заявление.

Также

Не используйте. * В списке выбора, в частности, определить выражения вам нужно возвращаемые

table_name.* удобно стенографии. Но лучше перечислить столбцы и выражения, которые нужно вернуть. Очень часто мы находим, что запросы .* возвращают больше столбцов, чем это действительно необходимо.

Хотя запрос в вашем ***** WORKING SOLUTION ***** может работать, он действительно не идеален.

  • заменить запятую между fuel и drives с ключевым словом JOIN.
  • заменить ключевое слово WHERE на ON
  • указать только столбцы, которые нужно возвращаемые в списке выбора
+0

, у вас есть ложное пространство в том, что должно быть в столбце 'timefrom' ... здесь **' BETWEEN drives.time from' ** – spencer7593

+0

о да, вы правы. Я починил это. но ошибка «Предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean задано ERROR» в цикле while все тот же – Timmey83

+0

Вопрос об этой ошибке задается и отвечает, много раз. Сделайте поиск. Интерфейс 'mysql_' устарел. Вместо этого используйте 'mysqli' или' PDO'. Проверьте возврат из выполнения запроса. Это возвращает результат, если запрос является успешным, и возвращает FALSE (логическое), если запрос не увенчался успехом. Проверьте это, прежде чем пытаться передать это как аргумент для извлечения. (Если ваш код не проверяет возвращение, он эффективно кладет его мизинец пальцем в угол рта, д-р Злой стиль и говорит: «Я просто предполагаю, что все пойдет по плану, что?») – spencer7593

0

Ваш запрос должен быть

SELECT fuel.* FROM fuel 
INNER JOIN drives 
ON 
drives.plate = fuel.plate 
WHERE fuel.time Between 
drives.timefrom AND 
drives.timeto 
0

Изменить

INNER JOIN fuel.* ON 

К

INNER JOIN fuel ON 
drives.plate = fuel.plate 
WHERE fuel.time Between 
drives.timefrom AND 
drives.timeto 
Смежные вопросы