簡體   English   中英

以相同方式編寫查詢時,從3個表返回不同的結果

[英]returning different results form 3 tables when the query is written the same way

您好,我有一個表格,可以按藝術家的名字選擇歌手,也可以選擇歌曲,然后選擇日期范圍並從中獲取全部統計信息,我想要實現的基本上是以下內容,

  • 獲得打數
  • 獲取歌曲數

問題是我寫的兩個查詢看起來都一樣,是否有另一種更好的方法來解決這個問題?

這是數據庫結構

3桌

  • 播放 :play_id | 日期
  • 歌曲 :plid | 援助
  • 藝術家 :援助| artist_name

樣本變量

$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

藝術家表

  • 急救= 34 | artist_name = SIA

預期結果

  • 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被排除在結果之外。

試試上面的代替

您遇到的問題是由您的數據和查詢方式引起的。 從樣本數據可以清楚地看出,一個播放可以包含多首歌曲。

這意味着,當您同時從playssongs表中列出匹配的記錄時,返回的記錄數將由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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM