PHP / MySQL联盟有两种选择

时间:2013-02-13 10:50:05

标签: 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>";
}

4 个答案:

答案 0 :(得分:1)

从两个查询中选择的列必须彼此匹配,包括列数和相应的数据类型:

  

第一个SELECT语句中的列名用作   返回结果的列名称。列出的选定列   每个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 :(得分:1)

你应该尝试这个查询..

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

答案 2 :(得分: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

答案 3 :(得分:1)

实际问题在于查询内部,因为在第一个查询中您获得两个字段,在第二个查询中您获得单个字段和union表示列必须匹配包括列类型和列数。

规则是。

以下是一些规则,用于管理在查询中使用UNION运算符的方式。

  1. 在UNION查询中,至少有两个SELECT语句。

  2. 两个SELECT语句必须具有相同的列数,且列必须具有兼容的数据类型。

  3. 每个SELECT语句中的列标题不必具有相同的名称。 UNION查询结果中的列标题始终取自第一个SELECT语句。

  4. 如果要对UNION操作的结果集进行排序,则只能在最后一个SELECT语句之后放置ORDER BY子句。无法在UNION查询中的任何其他SELECT语句中指定ORDER BY子句。

  5. ORDER BY子句中使用的列只能从第一个SELECT语句中获取。

  6. 如果未在UNION查询中指定ORDER BY子句,则结果集始终按第一列排序。

  7. 如果使用UNION ALL,则第二个SELECT语句的整个结果集将附加到第一个SELECT语句。在这种情况下,联合结果集中可能存在重复记录。

  8. 如果您只使用UNION,MySQL会从最终结果集中删除重复的行。