1

私の質問に続いて:

SELECT data1
FROM table1 t1
WHERE EXISTS (
SELECT id,
MATCH (
...
)
AGAINST (
...
) AS rank
FROM table2 t2
WHERE MATCH (
...
)
AGAINST (
....
)
) ORDER BY rank DESC

問題は、ランクがどこにあるのか認識できないことです。実際には、次のメッセージが表示されます。

#1054 - 「注文句」の不明な列「ランク」

4

2 に答える 2

0

WHERE EXISTSサブクエリを使用しています。

SELECT data1 FROM table1 t1 WHERE EXISTS (
    SELECT id,
    MATCH (...) AGAINST (...) AS rank
    FROM table2 t2
    WHERE MATCH (...) AGAINST (...) 
) ORDER BY rank DESC

このコンテキストでは、MySQLは選択されたフィールドを無視します。次のように読むこともできます。

SELECT data1 FROM table1 t1 WHERE EXISTS (
    SELECT 42
    FROM table2 t2
    WHERE MATCH (...) AGAINST (...) 
) ORDER BY rank DESC

そして、それはまったく同じように機能します。

WHERE EXISTS-subquery はブール値を返し、そのブール値だけを返すものと考えてください。

ランクを table2 から計算する場合はJOIN、メイン クエリ (および場合によってはGROUP BY句) に a を追加する必要があります。

編集:例

WHERE EXISTSほとんどの場合、句は必要ありません。(あなたの質問は特定するにはあまりにも具体的ではないので、これが標準的なケースです)

SELECT t1.data1, MATCH (...) AGAINST (...) AS rank
FROM table1 t1 
JOIN table2 t2 ON (MATCH (...) AGAINST (...))
GROUP BY t1.id, t1.data, rank
ORDER BY rank DESC

table2 に一致する行が最大で 1 つしかない場合は、この句を使用せずにGROUP BY直接結合するだけで済みます。

SELECT t1.data1, MATCH (...) AGAINST (...) AS rank
FROM table1 t1 
JOIN table2 t2 ON (MATCH (...) AGAINST (...))
ORDER BY rank DESC
于 2013-04-20T17:34:41.740 に答える