2

2 つのテーブルの列を出力するクエリを作成しようとしています。たぶん結合しようとしていましたが、左または右のテーブルで結合すると、値が返されない場合があります。UNION キーワードを使用することを考えましたが、列の名前が 1 つの名前に変更されます。それでは、どの列に何があるかわかりません。

クエリで両方のテーブルの列を選択したいのですが、どちらのテーブルにも一致するユーザー名が存在するかどうかは気にしません。とにかく、値を持たないすべての列がそこにあることを望んでいます。

SELECT *
FROM client_table
JOIN staff_table 
ON client_table.username = staff_table.username
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
OR staff_table " . mysql_real_escape_string($gotMyUser) . " LIMIT 1

アップデート:

ここにクエリの出力があります

Array
(
//FIRST TABLE
[client_id] => 332058
[username] => jake
[firstname] => jake
[lastname] => ****
[email] => *****
[phone] => 
[phone_ext] => 
[mobile] => 
[department] => 
[is_active] => 1
[default_site] => 0
[google] => 

//SECOND TABLE
[staff_id] => 
[group_id] => 
[dept_id] => 
[passwd] => 
[signature] => 
[isactive] => 
[isadmin] => 
[isvisible] => 
[onvacation] => 
[daylight_saving] => 
[append_signature] => 
[change_passwd] => 
[timezone_offset] => 
[max_page_size] => 
[auto_refresh_rate] => 
[created] => 
[lastlogin] => 
[updated] => 

)

ユーザーがスタッフIDまたはクライアントIDのいずれかを持っているかどうかを知りたいのですが、どちらの結合(LEFT RIGHTまたはFULL)に応じて、結果が返されない可能性があるため、これはまさに私が望むものです。クエリを実行してからテストするたびに、結果にこれらすべての列が含まれるようにします。

if($array['client_id']){
//do stuff with client
}

else if($array['staff_id']){
//do stuff with staff
}
4

5 に答える 5

2

Julius Davies が提案したように、FULL OUTER JOINコンセプトはまさにあなたが必要としているものです。ただし、MySQL にはそれらがないため、LEFT JOINと.UNIONRIGHT JOIN

(同じクエリが 2 つのブロックに複製されていることに注意してください。1 つは右外部結合を使用し、もう 1 つは左外部結合を使用します):

SELECT *
FROM client_table
LEFT OUTER JOIN staff_table 
ON client_table.username = staff_table.username
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
OR staff_table " . mysql_real_escape_string($gotMyUser) . " 

UNION


SELECT *
FROM client_table
RIGHT OUTER JOIN staff_table 
ON client_table.username = staff_table.username
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
OR staff_table " . mysql_real_escape_string($gotMyUser) . " 

この質問を参照してください

于 2013-01-15T18:18:11.150 に答える
1

が必要だと思いますunion allが、列名を正しく取得する必要があります。

SELECT 'client_table' as table_name, 
       client_id, username, firstname, lastname,  email, phone, phone_ext,mobile,department,is_active,default_site, google,
       NULL as staff_id, NULL as group_id, NULL as dept_id, NULL as passwd, NULL as signature, NULL as isactive, NULL as isadmin, NULL as isvisible, NULL as onvacation, NULL as daylight_saving,
       NULL as append_signature, NULL as change_passwd, NULL as timezone_offset, NULL as max_page_size, NULL as auto_refresh_rate, NULL as created, NULL as lastlogin, NULL as updated
FROM client_table
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
UNION all
select 'staff_table' as table_name,
       NULL as client_id, NULL as username, NULL as firstname, NULL as lastname,  NULL as email,
       NULL as phone, NULL as phone_ext, NULL as mobile, NULL as department, NULL as is_active, NULL as default_site, NULL as google,
       staff_id, group_id, dept_id, passwd, signature, isactive, isadmin, isvisible, onvacation, daylight_saving,
       append_signature, change_passwd, timezone_offset, max_page_size, auto_refresh_rate, created, lastlogin, updated
from staff_table 
where staff_table.username = " . mysql_real_escape_string($gotMyUser) . "
于 2013-01-15T18:53:23.203 に答える
1

「JOIN」を「FULL OUTER JOIN」に変更してみてください

http://en.wikipedia.org/wiki/Join_%28SQL%29#Full_outer_join

于 2013-01-15T18:15:30.050 に答える
0

私はあなたが何をしようとしているのかは、レコードがどのテーブルから来ているのかを知っていることだと思います。いくつかのサンプルデータと期待する結果を投稿すると役立ちます。

私が正しければ、client_tableとstaff_tableの両方が同じ構造を持っていると仮定すると、次のようなことができます。

SELECT 'client_table' as table_name, client_table.*
FROM client_table
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
UNION
select 'staff_table' as table_name, staff_table.*
from staff_table 
where staff_table.username = " . mysql_real_escape_string($gotMyUser) . "

table_nameを追加することで、データの出所がわかります。

于 2013-01-15T18:21:55.200 に答える
0

これを試してください。mysql には完全な外部結合を実行するオプションがないため、左結合と右結合の両方を結合できます。

SELECT *
FROM client_table
LEFT OUTER JOIN staff_table 
ON client_table.username = staff_table.username
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
OR staff_table " . mysql_real_escape_string($gotMyUser) . "
UNION
SELECT *
FROM client_table
RIGHT OUTER JOIN staff_table 
ON client_table.username = staff_table.username
WHERE client_table.username = " . mysql_real_escape_string($gotMyUser) . " 
OR staff_table " . mysql_real_escape_string($gotMyUser) . "
于 2013-01-15T18:17:53.433 に答える