2016-04-22 10 views
0

2つの表を結合しようとしていますが、結合する表内の列の1つでも照会結果を順序付けしようとしています。私はこのエラーを取得した時点でORDER BY cm.numを追加するまですべてが素晴らしい作品:ここ結合表のORDER BY

Call to a member function fetch_assoc() on boolean 

は私の完全なクエリです:

SELECT * 
FROM course 
    JOIN cm ON (course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
LIMIT $limit 
ORDER BY cm.num 

誰もが何か提案がありますか?

EDIT:

全コード要求通り:

function getCourses($searchTerm) { 
    $mysqli = new mysqli('localhost', 'scott', 'tiger', 'courses'); 
    if ($mysqli->connect_errno) { 
     header("HTTP/1.1 500 Internal Server Error"); 
     die("Failed to connect to MySQL: {$mysqli->connect_error}"); 
    } 
    $mysqli->set_charset('utf8'); 

    $courses = []; 
    $limit = $searchTerm == '' ? 1000 : 10; 
    $res = $mysqli->query("SELECT * FROM course JOIN cm ON (course = cm.course) WHERE title LIKE '%$searchTerm%' ORDER BY cm.num LIMIT $limit"); 
    while($row = $res->fetch_assoc()) { 
     $course = new Course(
      $row['id'], 
      $row['title'], 
      $row['href'], 
      $row['level'], 
      $row['award'], 
      $row['summary'], 
      $row['dept'], 
      $row['subject'], 
      $row['overview'], 
      $row['wyl'], 
      $row['careers'] 
     ); 

     array_push($courses, $course); 
    } 

    return $courses; 
} 
+0

'cm'はあなたのテーブル名ですか? – Saty

+0

を使用すると、クエリ全体の各列の前にテーブルの名前/エイリアスを明示的に記述する方がよい場合があります。 – mitkosoft

+1

は、そのコースのテーブルとそのテーブルの両方の列です。あなたのテーブルがどのように見えるか、名前が付けられているかという一般的な考え方が役立ちます。 – apokryfos

答えて

4

によって注文後の限界を入れ、具体的に

を列を指定JOIN cm ON (course.course = cm.course)

SELECT * 
FROM course 
    JOIN cm ON (course.course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
ORDER BY cm.num 
LIMIT $limit 
+0

残念ながら、私はそれを試みましたが、私はまだ同じ問題を抱えています。 – user3746428

+0

その後、完全なコードを投稿してください! – Saty

+0

あなたは 'course'フィールドの結合作業はテーブル' JOIN cm ON(course = cm.course) '' – urfusion

1

すなわちあなた持っていますあなたのコードに。コースはテーブルで、2つの列を結合したいとします。だからそれは何かのようにする必要があります(course.itsColumn = cm.course)

それが助けたら私に教えてください!

+0

'course'が単なる表であるのか、' course'も 'course'という表の列であるのかどうかはわかりません。問題は非常に不明です。 – apokryfos

+1

@apokryfos私は彼のTYPOだったので、私は同意するが、答えは彼がそれに気づくのに十分でなければならないので、彼の問題を解決する:) – Webeng

0

エイリアスを追加してみます。エイリアスを介して結合内のすべてのテーブルを参照することをお勧めします。

SELECT * 
FROM course AS c 
    LEFT JOIN cm AS cm ON (c.course = cm.course) 
WHERE title LIKE '%$searchTerm%' 
LIMIT $limit 
ORDER BY cm.num 
+0

私はちょっと混乱している。インナージョイン、レフトジョイン、ライトジョイン、フルジョインは何をするのですか? – Webeng

+0

クエリをコピーしてそこにエイリアスを入れてください。あなたはもちろん正しいです。 LEFT JOINでなければなりません。 – cb0

+1

MySQLでORDER BYの前にLIMITを本当にできますか? (他の製品はORDER BY LIMITを持っています) – jarlh

0

コードで自己結合を使用しています。だから、次のコードで確認してください:

SELECT * FROM course c 
JOIN course cm ON (c.course = cm.course) 
WHERE c.title LIKE '%$searchTerm%' 
ORDER BY cm.num LIMIT $limit 
関連する問題