gpt4 book ai didi

php - 当以相同方式编写查询时,从 3 个表返回不同的结果

转载 作者:行者123 更新时间:2023-11-29 11:18:23 25 4
gpt4 key购买 nike

您好,我有一个表格,我可以通过他的名字选择艺术家或选择一首歌曲并选择日期范围并从中获取统计数据,我想要实现的基本上如下,

  • 获取播放次数
  • 获取歌曲数量

问题是我正在编写的两个查询看起来相同,是否有其他方法可以更好地解决这个问题?

这是数据库结构

3张 table

  • 播放:play_id |日期
  • 歌曲:plid |援助
  • 艺术家:援助 |艺术家姓名

示例变量

$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- 援助 = 34 |艺术家姓名 = 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 的结果集,就像您想要的那样。但后来你有了 (a.artist_name= '$artist' OR s.aid = '$song')在 where 子句中,这将导致左连接中生成的 NULL 从结果中排除。

尝试上面的方法

关于php - 当以相同方式编写查询时,从 3 个表返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39372773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com