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

2つのクエリから選択される列は、列の数と対応するデータ型で互いに一致する必要があります。

最初のSELECTステートメントの列名は、返される結果の列名として使用されます。各SELECTステートメントの対応する位置にリストされている選択された列は、同じデータ型である必要があります。(たとえば、最初のステートメントで選択された最初の列は、他のステートメントで選択された最初の列と同じタイプである必要があります。)

クエリでは、最初の選択で2つの列が選択され、2番目の選択で1つの列のみが選択されます。これは正しくありません。回避策として、2番目の選択で空の文字列を選択できます。もう1つの問題は、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

最初のクエリでは2つのフィールドを取得し、2番目のクエリでは単一のフィールドを取得し、ユニオンは列のタイプと列の数を含めて列が一致する必要があると言うため、実際の問題はクエリ内にあります。

ルールは。

UNION 演算子がクエリで使用される方法を管理するいくつかのルールを次に示します。

  1. UNION クエリには、少なくとも 2 つの SELECT ステートメントがあります。

  2. 2 つの SELECT ステートメントの列数は同じでなければならず、列のデータ型には互換性がなければなりません。

  3. 各 SELECT ステートメントの列見出しは、同じ名前である必要はありません。UNION クエリの結果の列見出しは、常に最初の SELECT ステートメントから取得されます。

  4. UNION 操作の結果セットを並べ替える場合は、最後の SELECT ステートメントの後にのみ ORDER BY 句を配置できます。ORDER BY 句は、UNION クエリの他の SELECT ステートメントでは指定できません。

  5. ORDER BY 句で使用される列は、最初の SELECT ステートメントからのみ取得できます。

  6. UNION クエリで ORDER BY 句を指定しない場合、結果セットは常に最初の列で並べ替えられます。

  7. UNION ALL を使用すると、2 番目の SELECT ステートメントの結果セット全体が最初の SELECT ステートメントに追加されます。この場合、結合された結果セットに重複するレコードが存在する可能性があります。

  8. UNION のみを使用する場合、MySQL は最終的な結果セットから重複する行を削除します。

于 2013-02-13T10:56:30.287 に答える