4

結合している異なるテーブルに同じ名前のフィールドがあります。、、など。ticket.status_ 現時点では、クエリは。だけを返します。user.statustransaction.statusstatus

類似のフィールド名が上書きされないようにテーブル名を取得して、フィールド間の違いを確認するにはどうすればよいですか。

簡単に言えば:

$data = array($eventId);
$statement = $this->db->prepare("SELECT * FROM ticket, user, transaction 
                        WHERE ticket.eventId = ? 
                        AND ticket.userId = user.userId
                        AND ticket.transactionId = transaction.transactionId");

$statement->execute($data); 
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

私の研究ではPDO::ATTR_FETCH_TABLE_NAMES、それが役立つように見える定数を見つけましたが、実装方法がわかりません(私は$statement->setAttribute();どういうわけか推測します)。

また、PHPのドキュメントにはドライバーに依存していると記載されているため、機能しないのではないかと心配しています。

ありがとう

4

3 に答える 3

3

selectステートメントに新しいエイリアスを追加するだけです

$statement = $this->db->prepare("
    SELECT *, ticket.status AS ticket_status, user.status AS user_status, transaction.status AS transaction_status 
    FROM ticket, user, transaction 
    WHERE ticket.eventId = ? 
    AND ticket.userId = user.userId
    AND ticket.transactionId = transaction.transactionId
");

その後、あなたはすることができます

$rows[0]['user_status'];
$rows[0]['ticket_status'];
$rows[0]['transaction_status'];

パフォーマンスに本当に関心がある場合は、返されるデータの量が多くなるため、新しいエイリアスを追加する代わりに、すべての列を選択して、その間に列にエイリアスを配置できますstatus

于 2013-03-14T16:51:11.213 に答える
1

代わりに実際に参加するように変更してみませんか:

SELECT 
t.status as ticket_status, u.status as user_status, tr.status as trans_status
FROM 
ticket as t
inner join user as u on t.userId = u.userId
inner join transaction as tr on t.transactionId = tr.transactionId
where
t.eventId = ?

を使用してテーブルをキャストする必要はありませんが、すっきりしてas somethingいます。

結合メソッドではなく、この問題を実際に修正する列のキャストに注意してください。

于 2013-03-14T16:49:00.403 に答える
1

最も明白なコメントは、「それをしないでください、それがエイリアスが存在する理由です」です。しかし、まだ根底にある良い質問があります。MySQLは、結果セットの列がどこから来たのか(テーブル、ビュー、または計算)に関する情報を送信しますか?

オブジェクトにはgetColumnMeta()PDOStatementという実験的なメソッドがあるため、明らかにそうです。私はテストしてきました、そしてそれはキーがどこにある連想配列を返しますtable

  • 列がテーブルまたはビューからのものである場合は、ソーステーブルが含まれます
  • 列が計算される場合は空の文字列です

もちろん、とにかくエイリアスに固執します。連想配列を使用できることは、私にとってキラーな機能です。

于 2013-03-14T17:47:22.987 に答える