0

我的陈述有什么问题?我已经尝试了我能想到的一切。

$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

4 回答 4

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;
于 2013-02-13T10:52:46.050 回答
1

你应该试试这个查询..

SELECT host_name, review_title,host_url FROM lhr_reviews
LEFT JOIIN lhr_hostinfo
    on(host_name = ?)
ORDER BY host_name
于 2013-02-13T10:54:05.640 回答
1

中的问题UNIONSelected 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 语法

于 2013-02-13T10:54:28.733 回答
1

实际问题在查询内部,因为在第一个查询中你得到两个字段,在第二个查询中你得到一个字段,并且联合说列必须匹配,包括列类型和列数。

规则是。

以下是一些管理查询中使用 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 会从最终结果集中删除重复的行。

于 2013-02-13T10:56:30.287 回答