2013-03-16 2 views
1

Ну, я в Mysql таблицу (oc_calendar), как это:Mysql выберите запрос с несколько ид

id  start_date   username 
1  2013-04-04   18 
2  2013-03-31   19 
3  2013-04-04   19 
4  2013-04-02   19 
5  2013-04-03   18 

С следующим запросом я могу получить весь идентификатор на основе результата поиска:

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'"); 

while($re_search = mysql_fetch_array($search)) { 

$search_p_id = $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 

Теперь я пытаюсь получить другую таблицу (property_step1) информацию на основе переменной $ search_p_id со следующим запросом, но это ошибка отображения. Возможно, мой запрос неверен.

Примечание: Переменная $ search_p_id может быть 18 или 19, 18 и т.д ..

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")"); 

Почему это показать сообщение об ошибке, любая идея?

+0

Какое сообщение об ошибке вы получите? – amitchhajer

+0

Вы должны сказать, какую ошибку вы получаете – rantsh

ответ

5

Там нет необходимости для двух запросов, вы можете сделать это только один запрос, по JOIN ИНГАМ две таблицы:

SELECT p.* 
FROM oc_calendar AS o 
INNER JOIN property_step1 AS p ON o.username = p.propertyid 
WHERE o.start_date between '$from' AND '$to'; 

Я предположил условие соединения: o.username = p.propertyid, так как вы получите список username значений из первой таблицы выберите все строки из второго значения, где propertyid в списке username значений, выбранных из первой таблицы, с использованием предиката IN. Итак, я использовал JOIN, это как предикат IN, но это безопаснее и позволяет выбирать столбцы из обеих таблиц.


Обратите внимание, что: Пожалуйста Stop с использованием Mysql_ * расширений, код этот путь открыт для SQL Injection, также не рекомендуется. Используйте вместо этого PDO или подготовленные инструкции.

+1

Спасибо, я пытаюсь. –

+0

@BabuAhmed - Добро пожаловать в любое время :) –

+0

Да, это работает, спасибо :) –

1

$search_p_id В настоящее время это не массив, поэтому implode(',', $search_p_id), скорее всего, не работает.

изменения, как вы установите $search_p_id

while($re_search = mysql_fetch_array($search)) { 
    $search_p_id[] = $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 
2

Вы не можете использовать implode() данным, не являющихся массивами. вы shoul измените значение $search_p_id значение как массив.

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date between '$from' AND '$to'"); 
$search_p_id = array(); 

while($re_search = mysql_fetch_array($search)) { 
    $search_p_id []= $re_search['username']; // here is the result Like: 18, 19 etc.. 
} 

$search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . implode(',', $search_p_id) . ")"); 
1

Вы, во-первых, используете устаревший mysql api, переключитесь на pdo, как говорит Махмуд.

Во-вторых, вы используете функцию implode для $ search_p_id для не массивного массива, который может дать вам нежелательный результат. Вместо этого попробуйте следующее:

$search = mysql_query("SELECT DISTINCT username FROM oc_calendar WHERE start_date 
between '$from' AND '$to'"); 
$search_p_id = array(); 
while($re_search = mysql_fetch_array($search)) { 
    array_push($search_p_id, $re_search['username']); 
} 

search = mysql_query("SELECT * FROM property_step1 WHERE propertyid IN (" . 
implode(',', $search_p_id) . ")"); 
Смежные вопросы