[英]returning different results form 3 tables when the query is written the same way
您好,我有一個表格,可以按藝術家的名字選擇歌手,也可以選擇歌曲,然后選擇日期范圍並從中獲取全部統計信息,我想要實現的基本上是以下內容,
問題是我寫的兩個查詢看起來都一樣,是否有另一種更好的方法來解決這個問題?
這是數據庫結構
3桌
樣本變量
$artist = SIA
$song = chandelier
$start_date = 2016-09-06
$end_date = 2016-09-07
樣本數據庫數據
播放表
A- play_id = 12 | 日期= 2016-09-06
B- play_id = 13 | 日期= 2016-09-07
C- play_id = 14 | 日期= 2016-09-07
歌曲表
A- plid = 12 | 援助= 34
B- plid = 12 | 援助= 34
C- plid = 13 | 援助= 34
D- plid = 14 | 援助= 34
E- plid = 14 | 援助= 34
藝術家表
預期結果
A-每位藝術家的演奏次數= 3
B-每位歌手的歌曲數= 5
查詢歌曲(這可以正常工作並計算歌曲的正確性)
$q2 = "
SELECT *
FROM songs s
LEFT
JOIN plays p
ON p.play_id = s.plid
LEFT
JOIN artist a
ON a.aid = s.aid
WHERE (a.artist_name = '$artist' OR s.aid = '$song')
AND date BETWEEN '$start_date' AND '$end_date'";
查詢劇本(此查詢返回的結果與查詢歌曲的結果相同,應返回該藝術家的劇本數)
$q1 = "
SELECT *
FROM plays p
LEFT
JOIN songs s
ON s.plid = p.play_id
LEFT
JOIN artist a
ON a.aid = s.aid
WHERE (a.artist_name= '$artist' OR s.aid = '$song')
AND date BETWEEN '$start_date' AND '$end_date'";
讓我們看第二個查詢...
$q1 = "
SELECT *
FROM plays p
LEFT
JOIN songs s
ON s.plid = p.play_id
LEFT
JOIN artist a
ON a.aid = s.aid
WHERE (a.artist_name= '$artist' OR s.aid = '$song')
AND date BETWEEN '$start_date' AND '$end_date'";
可能需要成為...
$q1 = "
SELECT *
FROM plays p
LEFT JOIN songs s
ON s.plid = p.play_id
LEFT JOIN artist a
ON a.aid = s.aid
and (a.artist_name= '$artist' OR s.aid = '$song')
WHERE date BETWEEN '$start_date' AND '$end_date'";
發生的情況是,LEFT聯接可以根據需要使用NULL生成結果集。 但是然后,您在where子句中使用了(a.artist_name= '$artist' OR s.aid = '$song')
,這將導致左側聯接中生成的NULL被排除在結果之外。
試試上面的代替
您遇到的問題是由您的數據和查詢方式引起的。 從樣本數據可以清楚地看出,一個播放可以包含多首歌曲。
這意味着,當您同時從plays
和songs
表中列出匹配的記錄時,返回的記錄數將由songs
表確定,因為它具有重復數據。
要獲得播放次數,您需要計算查詢返回的不同 play ids
的數量。 由於song
表中的重復項,簡單計數將返回5。 另外,您不需要@xQbert解釋的左聯接,所以我只使用了內部聯接,因為您只想匹配比賽。 我還刪除了對歌曲的過濾,因為您堅持認為第二個查詢應返回給定藝術家的演奏數量。 您可以隨意添加該條件。
$q1 = "
SELECT count(distinct p.play_id) as count_of_plays
FROM plays p
INNER
JOIN songs s
ON s.plid = p.play_id
INNER
JOIN artist a
ON a.aid = s.aid
WHERE a.artist_name= '$artist'
AND date BETWEEN '$start_date' AND '$end_date'";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.