0

と の違いを学ぼうとしていJOINますLEFT JOIN。YouTube の動画をいくつか見て、Google で調べました。ただし、JOIN クエリが機能しない理由がよくわかりません。SQL を実行すると、 が得られColumn 'user_id' in field list is ambiguousます。

販売表

sales_id   user_id   amount    date         status
3          1         1258.32   2013-07-02   S

ユーザー テーブル

user_id   fname   lname
1         John    Doe

私のコード:

$top = mysqli_query($mysqli, "SELECT user_id, fname, lname, SUM(amount) as total 
FROM sales
LEFT JOIN users ON
user_id.sales = user_id.users
WHERE status = 'S' AND MONTH(date) = MONTH(CURDATE()) AND YEAR(date) = YEAR(CURDATE()) GROUP BY user_id ORDER BY total DESC LIMIT 5");

     while($row = mysqli_fetch_assoc($top)) {
           $topamount[]     = $row['total'];
           $topfnameuser[]  = $row['fname'];
           $toplnameuser[]  = $row['lname'];
     }
4

5 に答える 5

2

と の両方salesusersという名前の列があるため、リストuser_idで必要なものを具体的にする必要がSELECTあります。

SELECT sales.user_id as user_id, fname, lname, SUM(amount) as total 
FROM sales
LEFT JOIN users
ON sales.user_id = users.user_id
WHERE status = 'S' AND MONTH(date) = MONTH(CURDATE()) AND YEAR(date) = YEAR(CURDATE()) 
GROUP BY user_id
ORDER BY total DESC
LIMIT 5

ONまた、句内でテーブルと列の名前が逆になっています。でtable.columnはありませんcolumn.table

于 2013-07-05T23:05:40.127 に答える
1

「 と の違いを知ろうとする」部分に着目するとJOINLEFT JOIN外部結合は、関連する別のテーブルに対応する行がない場合でも、あるテーブルのすべての行を表示したい場合に便利です。

学生とテストの成績を使用した簡単な例を次に示します。

create table students (student_id serial primary key, student_name text);
create table tests (test_id serial primary key, test_name text, test_date date);
create table grades (
    student_id int,
    test_id int,
    grade char,
    primary key (student_id, test_id),
    foreign key (student_id) references students (student_id),
    foreign key (test_id) references tests (test_id));

insert into students (student_name) values ('joe');
insert into students (student_name) values ('amber');
insert into students (student_name) values ('steve');

insert into tests (test_name, test_date) values ('test 1', '2013-01-20');
insert into tests (test_name, test_date) values ('test 2', '2013-02-10');

insert into grades (student_id, test_id, grade) values (1, 1, 'A');
insert into grades (student_id, test_id, grade) values (1, 2, 'B');
insert into grades (student_id, test_id, grade) values (2, 1, 'B');
insert into grades (student_id, test_id, grade) values (2, 2, 'A');

次のクエリは、学生とその成績のリストを返します。これには、まだ成績のない学生 (この場合は Steve) を識別する 1 つの行が含まれます。

select s.student_name, t.test_name, t.test_date, g.grade
from students as s
left join grades as g on s.student_id = g.student_id
left join tests as t on g.test_id = t.test_id;

student_name | test_name | test_date  | grade 
--------------+-----------+------------+-------
joe          | test 1    | 2013-01-20 | A
joe          | test 2    | 2013-02-10 | B
amber        | test 1    | 2013-01-20 | B
amber        | test 1    | 2013-01-20 | A
steve        |           |            | 
(5 rows)

外部結合を使用する非常に便利な方法の 1 つは、関連するテーブル内の一致する行がない行のみを表示する場合です。サブクエリでこれを行うこともできますが、外部結合を使用することは悪いオプションではありません。

select s.student_name                                   
from students as s
left join grades as g on s.student_id = g.student_id
where g.student_id is null;
student_name 
--------------
steve
(1 row)

...機能的には次と同等です。

select student_name from students where student_id not in (select student_id from grades); 
student_name 
--------------
steve
(1 row)
于 2013-07-05T23:55:32.390 に答える
0

JOIN結合する両方のテーブルに特定の ID がある場合に使用します。

LEFT JOIN特定のIDが1つのテーブルにあり、おそらく2番目のテーブルにある場合に使用します

あなたの場合、ユーザーから選択し、販売に参加する必要があります

SELECT u.user_id, u.fname, u.lname, SUM(s.amount) as total 
FROM users u LEFT JOIN sales s ON s.user_id = u.user_id
WHERE s.status = 'S' AND MONTH(s.date) = MONTH(CURDATE()) AND YEAR(s.date) = YEAR(CURDATE())
GROUP BY u.user_id
ORDER BY total DESC LIMIT 5

テーブル名のエイリアス (users u) に注意してください。次に、そのエイリアスを使用して、どのテーブルからどの列を選択するかを指定できます。

また、MySQL の予約語であるため、列に「date」という名前を付けないことをお勧めします。参照: http://dev.mysql.com/doc/refman/5.6/en/reserved-words.html

于 2013-07-05T23:06:07.967 に答える
0

フィールドを参照するときに参照できるように、テーブル エイリアスを導入します。あなたの問題はuser_id、両方のテーブルにあり、user_id を読み取るテーブルを定義していないことです。

"SELECT s.user_id, u.fname, u.lname, SUM(s.amount) as total 
FROM sales AS s
LEFT JOIN users AS u ON
s.user_id = u.user_id
于 2013-07-05T23:07:26.433 に答える