2

バックグラウンド

私が mySQL n00b であるため、3 つのテーブルを一致させるために考え出すことができる最良のクエリは、2 つのテーブル間の比較を実行し、変数を出力し、その変数を使用して相互参照テーブルから最終的な出力を選択することです。その後、さらに別のクエリを実行して、3 番目のテーブルから出力します...

これで、1 つのステートメントだけで必要なすべての行を選択する方法があることがわかりましたが、私の人生では、それをつなぎ合わせることができません。誰かが私が必要とするクエリを正しく構造化するのを手伝ってくれませんか?

3 つのテーブルからの情報を使用して php で結果セットを出力し、2 つのテーブルの ID 間の実際のリンクとして別のテーブルを使用する必要があります。ありがとうございました!!

テーブル

name: table_one
-----------------------------------------------------------
id | user_id | o_id | num | likes | dislikes | .... | ... |
-----------------------------------------------------------
 1 | 765     | 1    | 100 |android| cats                  |
 2 | 765     | 2    | 100 | birds | mySQL queries         |
 3 | 765     | 3    | 100 | php   | iPhones               |
 4 | 765     | 2    |  2  |oranges| bananas               |
-----------------------------------------------------------

name: table_two                            
------------------------------------------------------------|
id |first_name| location | num_times | diploma | why        |
------------------------------------------------------------|
1 | ABC     | here     | 0         | none    | because      |
2 | BCD     | there    | 5         | BS      | no reason    |
3 | Sally   | nowhere  | 194384    | DR      | no reason    |
4 | Jack    | overthere| 3         | none    | failure      |
5 | Bob     | Mars     | 0         | random  | in training  |
-------------------------------------------------------------

name: table_agency         |
---------------------------|
id | name | address        | 
---------------------------|
1  | A    | 123x           | 
2  | B    | 234y           | 
3  | C    | 456z           | 
----------------------------
name: table_link 
-----------------------------
          rel_a | rel_b           
---------------------------------
           1   |    1            |
           1   |    4            |
           1   |    5            |
           2   |    1            |
           2   |    4            |
           2   |    5            |
           3   |    2            |
           3   |    3            |
           4   |    3            |
--------------------------------- 

出力/PHP

$results = $class->runQuery($query);    //basically a fetchAll
foreach ($results as $result) { 
echo id_table_one ($result['id']);              
echo $result['name'];
echo $result['num'];
echo $result['likes'];
echo other_rows...basically table_one.*
echo all_first_names&num_times that correspond in the table link;
}

    //ACTUAL Printout(echo doesn't have the ,'s):
    //here should be the output:

-------------------------------------------------
1 | A     | 100  | android  | ABC-0/Jack-3/Bob-0|
2 | B     | 100  | birds    | ABC-0/Jack-3/Bob-0|
3 | C     | 100  | php      | BCD-5/Sally-194384|
4 | B     | 2    | oranges  | Sally-194384      |
----------------------------------------------  

サイドノート

1) 名に関連付ける相互参照項目のエントリが少なくとも 1 つ、最大 7 つのエントリがあります (クエリである必要はありませんが、参照用です)。

2) 項目のエントリは 3 つだけです。table_agency

3) 結果セットは以下で修飾されなければなりません:user_id=".$variable

4)元のクエリ、多かれ少なかれ...しかし、取得しようとしている追加情報の間に共通性がないため、引き分けにする関数を作成することを余儀なくされました....これはアイデアを貸すはずです私が達成しようとしているものの:

$query = "select
          a.*,
          b.name,
          b.id   as agency_id
      from table_one a,  table_agency b
      where a.agency_id = b.id
      and a.user_id = ".$variable;

first_names実際に対応するものが新たに追加されました$result['name']

5) ネストされた配列を使用して、 ???foreach(のネストされた配列の最終結果セットを実際に出力できます。first_name

6) 質問(回答)にコメントを残してください。あなたの努力から学べます! 質問に答えてもらうだけではなく、手順と方法論についても学ぼうとしています。

7) 事前にすべてのご協力に感謝します...これは間違いなくヘッドスクラッチャーです. ありがとう!!!

4

1 に答える 1

3

このクエリで出力を取得できます

SELECT
    ta.id,
    ta.name,
    to.num,
    to.likes,
    GROUP_CONCAT(tt.first_name SEPARATOR '-') AS `names`
FROM table_agency AS ta
LEFT JOIN table_one AS `to` ON to.o_id = ta.id
LEFT JOIN table_link AS tl ON tl.rel_a = to.id
LEFT JOIN (SELECT id , first_name FROM table_two) AS tt ON tt.id = tl.rel_b
WHERE to.user_id = 765
GROUP BY to.id

PHPコードのuser_idを変数に置き換えることができます。そして、ABC-0/Jack-3/Bob-0これを簡単に置き換えることができますGROUP_CONCAT(tt.first_name SEPARATOR '/') AS names

SQL フィドルのデモ

出力

| ID | NAME | NUM |   LIKES |        NAMES |
--------------------------------------------
|  1 |    A | 100 | android | ABC-Jack-Bob |
|  2 |    B | 100 |   birds | Bob-ABC-Jack |
|  3 |    C | 100 |     php |    BCD-Sally |
|  2 |    B |   2 | oranges |        Sally |

編集:

これが編集されたクエリです。MySQL Concat関数を使用できます

SELECT
    ta.id,
    ta.name,
    to.num,
    to.likes,
    GROUP_CONCAT(tt.first_name SEPARATOR '/') AS `names`
FROM table_agency AS ta
LEFT JOIN table_one AS `to` ON to.o_id = ta.id
LEFT JOIN table_link AS tl ON tl.rel_a = to.id
LEFT JOIN (
          SELECT 
          id , 
          CONCAT(first_name,'-',num_times) as first_name 
          FROM table_two
        ) AS tt ON tt.id = tl.rel_b
GROUP BY to.id; 

デモ

出力

| ID | NAME | NUM |   LIKES |              NAMES |
--------------------------------------------------
|  1 |    A | 100 | android | ABC-0/Jack-3/Bob-0 |
|  2 |    B | 100 |   birds | ABC-0/Jack-3/Bob-0 |
|  3 |    C | 100 |     php | BCD-5/Sally-194384 |
|  2 |    B |   2 | oranges |       Sally-194384 |
于 2013-05-14T06:55:09.873 に答える