2016-07-03 19 views
3

LEFT JOIN私のデータベースから2つのテーブルの値を取得しました。同じ名前の列が2つある場合、左結合の列を選択する方法は? [MySql]

SELECT * 
FROM thread 
    LEFT JOIN comments ON thread.id_thread = comments.id_thread 
WHERE id_type = '1' 
ORDER BY data DESC, hour DESC 

次にI出力値この方法:commit.php(フォームのアクション)で次に

<? 

while($row = mysqli_fetch_array($query)) 
{ 
echo '<div class="col-md-1"></div>'; 
echo '<div class="col-md-11">'; 
echo $row['title'] ."<br><br>".$row['content']."<br><br>"; 
echo $row['content_com']; 
echo '<div class="col-md-2 pull-right">'. "date: ".$row['data']."<br>"."author: ".'<a href ="/user.php?id='.$row['username'].'">'.$row['username'].'</a>'.'</div>' ."<br><br>"; 
echo '<form role="form" action="commit.php" method="post"><div class="col-md-offset-1 col-md-9"><input class="form-control" type="text" name="comm"><input type="hidden" name="thread_id" value="'.$row['id_thread'].'"></div></form> <br><br><hr><br>'; 
echo '</div>'; 
} 

mysqli_close($connect); 
?> 

<?php 
session_start(); 

    if(isset($_SESSION['id'])) 
    { 
    $servername = "mysql9.000webhost.com"; 
    $username = "a5461665_admin"; 
    $password = "xenovia1"; 
    $dbname = "a5461665_pap"; 

    $connect = mysqli_connect($servername, $username, $password, $dbname); 

    $id = (isset($_GET['id'])) ? $_GET['id'] : $_SESSION['id']; 

    $ctn = $_POST["comm"]; 

     $com = mysqli_query($connect,"INSERT INTO comments(content_com,id_thread) values ('".$ctn."', '".$_POST['thread_id']."')"); 

     header("location:javascript://history.go(-1)"); 


    if (!$connect) { 
     die("Connection failed: " . mysqli_connect_error()); 
    } 

} 
else 
{ 
    header(" url=index.php"); 
} 


?> 

私の問題
クエリは、このようなものです隠された入力ボックスがフィールドid_threadテーブルcommentsからフォームアクションに渡っていることですが、私はそれが偽者を渡したいld id_threadテーブルthreadsから、どうすればいいですか?

+2

あなたは[SQLインジェクション](http://php.net/manual/en/security.database.sqlに広く開いています-injection.php)。 MySQLiを使用しているので、[Prepared Statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を参照してください。 –

答えて

5
SELECT *, thread.id_thread as mycol 
FROM 
thread LEFT JOIN comments 
ON thread.id_thread=comments.id_thread 
WHERE thread.id_type = '1' 
ORDER BY data desc, hour desc 

テーブルにカラム名を指定してエイリアスします。 したがって、thread.id_threadとし、別名mycolとすると、すべての列についてSELECT *となります。これはmycolとして利用できるようになり、それ以上の名前の衝突はありません。

+0

両方のテーブルにはid_threadというフィールドがありますが、スレッド - > id_threadそれは私にコメントを与える - > id_thread – kraven2g

+0

@ kraven2g ok..editing – Iceman

+0

@ kraven2g - まず、あなたは 'SELECT * FROM ...'を使うべきではありません。 2つのカラムが同じ名前の場合は、 'SELECT table1.col1、table1.col2 ...、table2.col1 AS col1_2 ... 'のように' AS'キーワードを使用します。 –

1

あなたは「エイリアス」またはテーブル名を使用することができます - そしてTは、テーブル名、スレッド、T.*ためALISである、あなたは

SELECT T.*, comments.id_thread AS comment_thread_id 
FROM thread T 
LEFT JOIN comments 
    ON thread.id_thread=comments.id_thread 
WHERE id_type = '1' ORDER BY data desc, hour desc 

参照を使用したい列を指定threadテーブルからすべてのcolsを選択します、 comments.id_threadcomment_thread_id

1

という名前のテーブルcomments次からあなたもテーブルを結合するためにUSING()の代わりONを使用することができますエイリアス/テーブル名を使用するだけで、列IDがかかります。ここで

SELECT T.*, comments.id_thread AS comment_thread_id 
FROM thread T 
LEFT JOIN comments 
    USING(id_thread) 
WHERE id_type = '1' ORDER BY data desc, hour desc 

は、両方の方法の違いの素敵な説明です:https://stackoverflow.com/a/11367066/3595565

関連する問題