2013-02-13 2 views
0

Что случилось с моим заявлением? Я пробовал все, что мог придумать.Союз PHP/MySQL с двумя выборами

$stmt = $mysqli->prepare("SELECT host_name, review_title FROM lhr_reviews 
       UNION 
       SELECT host_url FROM lhr_hostinfo WHERE host_name = ? 
       ORDER BY host_name"); 

$stmt->bind_param("s", $id); 
$stmt->execute(); 
$res = $stmt->get_result(); 

while($row = $res->fetch_assoc()) { 
    $list .= "<li><a href='".$row['host_url']."'>".substr($row['review_title'],0,20)."</a></li>"; 
} 
+1

Кто-нибудь сказал, чтобы вы не использовали unionALL.? –

ответ

1

Столбцы, выбранные из двух запросов должны соответствовать друг другу, в число столбцов и соответствующих типов данных:

имена столбцов из первой ЗЕЬЕСТ используются как имена столбцов для возвращаемых результатов. Выбранные столбцы, перечисленные в , соответствующие позиции каждого оператора SELECT должны иметь одинаковый тип данных . (Например, первый столбец выбран первым заявление должно иметь тот же тип, что и первого столбца, выбранного других утверждений.)

В запросе, первый выберите выбирает две колонки, где второй один выбирает только один столбец. Это неверно, вы можете выбрать пустую строку во втором выборе в качестве работы. Другой проблемой является ORDER BY host_name вы можете добавить его таким образом, вы должны поместить эти запросы внутри подзапроса и порядок во внешнем один, как это:

SELECT * 
FROM 
(
    SELECT host_name, review_title FROM lhr_reviews 
    UNION 
    SELECT host_url, ''   FROM lhr_hostinfo WHERE host_name = ? 
) AS sub 
ORDER BY host_name; 
1

вам следует попробовать этот запрос ..

SELECT host_name, review_title,host_url FROM lhr_reviews 
LEFT JOIIN lhr_hostinfo 
    on(host_name = ?) 
ORDER BY host_name 
1

Проблема в UNION. Selected columns listed in corresponding positions of each SELECT statement should have the same data type.

Попробуйте это:

$stmt = $mysqli->prepare(
      "SELECT * FROM 
       (SELECT host_name, review_title FROM lhr_reviews 
       UNION 
       SELECT host_url, NULL FROM lhr_hostinfo WHERE host_name = ?) A 
       ORDER BY host_name"); 

UNION Syntax

1

Реальная проблема заключается в запросе, потому что в первом запросе вы получите два поля и при втором запросе вы получаете одно поле и объединение говорит столбец должен соответствовать включая тип столбца и номер столбца.

Правила.

Вот несколько правил, которые определяют способ использования оператора UNION в запросе.

  1. В запросе UNION существует как минимум два оператора SELECT.

  2. Два оператора SELECT должны иметь одинаковое количество столбцов, а столбцы должны иметь совместимые типы данных.

  3. Заголовки столбцов в каждом из операторов SELECT не обязательно должны иметь одно и то же имя. Заголовки столбцов в результате запроса UNION всегда берутся из первого оператора SELECT.

  4. Если вы хотите отсортировать набор результатов операции UNION, вы можете поместить предложение ORDER BY после последнего оператора SELECT. Предложение ORDER BY не может быть указано ни в каких других операторах SELECT в запросе UNION.

  5. Столбец (и), используемый в предложении ORDER BY, может быть взят только из первого оператора SELECT.

  6. Если вы не укажете предложение ORDER BY в запросе UNION, набор результатов всегда сортируется по первому столбцу.

  7. Если вы используете UNION ALL, весь результирующий набор из второго оператора SELECT добавляется к первому оператору SELECT. В этом случае в объединенном результирующем наборе могут быть дубликаты записей.

  8. Если вы используете UNION, MySQL удаляет повторяющиеся строки из окончательного набора результатов.

Смежные вопросы