Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 再添加一个表以查询和统计SQL数据_Php_Mysql_Sql_Database - Fatal编程技术网

Php 再添加一个表以查询和统计SQL数据

Php 再添加一个表以查询和统计SQL数据,php,mysql,sql,database,Php,Mysql,Sql,Database,我尝试从4个表中选择数据(最后一个表需要统计数据) 我的MySQL表结构 使用者 图像 id user_id image 用户跟踪 id user_id follow_id 评论 id user_id image_id text 我得到了以下SQL查询: $sql = "SELECT u.username as user, i.image as user_image, p.image, p.date FROM users u

我尝试从4个表中选择数据(最后一个表需要统计数据)

我的MySQL表结构

使用者

图像

id
user_id
image
用户跟踪

id
user_id
follow_id
评论

id
user_id
image_id
text
我得到了以下SQL查询:

    $sql = "SELECT u.username as user, i.image as user_image, p.image, p.date
            FROM users u              
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images p ON p.user_id = u.id
            LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
            WHERE f.user_id = 3 OR p.user_id = 3       
            ORDER BY p.date DESC";
此行返回用户当前图像(最后一个图像)

它返回我和我朋友的所有图像

[0] => Array
    (
        [user] => 8888
        [user_image] => second.jpg
        [image] => second.jpg
        [date] => 2012-01-24 14:42:27
    )

[1] => Array
    (
        [user] => 8888
        [user_image] => second.jpg
        [image] => first.jpg
        [date] => 2012-01-24 14:42:27
    )

[2] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
    )

[3] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
    )
我试图补充

 left join commentaries c ON c.user_id = u.id
结果是

[2] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
        [id] => 1
    )

[3] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
        [id] => 2
    )

[4] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
        [id] => 1
    )

[5] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
        [id] => 2
    )
如果用户有注释,则复制用户(顺便说一句,[user]=>3333在示例中有2条注释)


我试图再添加一个表“评论”,并计算每张图片(来自我和我的朋友)有多少评论,如果没有带有$user\u id的评论,则返回0

您真的知道如何让问题变得混乱。 这里的问题是你没有理解加入的后果

用你的例子。您有一个表(本例中为用户),该表与其他两个表(图像和注释)具有一对多的关系

例如:

         users
        /     \
  images       commentaries
当您尝试同时将这两个相关表连接到基表时,其效果是在两个子表之间产生等效的完全外部连接

这:

与此完全相同:

SELECT *
FROM images p
LEFT JOIN commentaries c ON c.user_id = p.user_id
(就产生的记录数量而言)

如果其中一个子表与父表之间有1对1的关系就可以了,但它们没有。由于它们中都有多个记录,因此效果是完全的外部联接,结果是输出中生成的记录数的乘积。输出将包含一个或多个记录,其数量等于一个表中匹配记录的数量乘以另一个表中匹配记录的数量。因此,由于每个表中有两条记录与该用户id匹配,因此结果集包含四条记录

你的问题的最后一部分很难理解,所以澄清一下就好了。似乎你只是在试图从一个表或另一个表中统计记录,尽管坦率地说,我不确定是哪一个

下面这一行非常令人困惑

数一数每张图片上有多少评论

事实上,如果您只想从一个表或另一个表中计算记录,那么分组将解决乘法问题

$sql = "SELECT u.username as user, i.image as user_image, p.image, p.date, c.commentcount
        FROM users u              
        LEFT JOIN user_follow f ON u.id = f.follow_id
        LEFT JOIN images p ON p.user_id = u.id
        LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
        LEFT JOIN (SELECT x.user_id, COUNT(*) AS commentcount FROM commentaries x GROUP BY x.user_id) c ON c.user_id = u.id
        WHERE f.user_id = 3 OR p.user_id = 3       
        ORDER BY p.date DESC";
正如前面所评论的那样,这种方法的问题在于它基本上与图像无关。图像和评论之间没有明显的直接联系。通过用户表,它们之间只存在多对多关系。所以,我很难确定这对你有什么帮助

本质上,这只会给出用户的评论数。它与图像无关。您可以使用非常类似的代码来告诉您一个用户有多少个图像,但这与注释无关

如果您希望做的是确定用户有多少个,如果用户有另一个,那么这将回答该问题。您只需在WHERE子句中添加一个测试,以确定用户是否具有所需的相关记录


如果你能澄清你的意图,我也许能提供更多帮助。否则,我希望这会有所帮助。

您需要使用
groupby
来计算组中的行数(在您的示例中,每个图像都有注释)。此查询应实现以下功能:

SELECT u.username as user, i.image as user_image, p.image, p.date,
            COALESCE ( imgcount.cnt, 0 ) as comments
            FROM users u              
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images p ON p.user_id = u.id
            LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
            LEFT JOIN 
            ( SELECT image_id, COUNT(*) as cnt FROM
                 commentaries 
              GROUP BY image_id  ) imgcount
            ON p.id = imgcount.image_id
            WHERE f.user_id = 3 OR p.user_id = 3       
            ORDER BY p.date DESC

评论似乎与图像无关。在
commentaries
表中应该有
image\u id
列。您是对的,我已经向我的数据库中添加了一个字段image\u id,但仍然不知道如何添加“commentaries”表和计算imagesa,现在您已经更改了数据结构,我想piotrm的答案可能回答了您的问题。此查询不计算每个图像的评论。它计算并返回每个图像有多少评论是这样的用户。例如(user_id=3)已经评论过一次(image_id=5)和(image_id=6)。因此,对于每个图像,它必须返回image_id=5,其中comment_count=1,image_id=6 comment_count=1
SELECT *
FROM images p
LEFT JOIN commentaries c ON c.user_id = p.user_id
$sql = "SELECT u.username as user, i.image as user_image, p.image, p.date, c.commentcount
        FROM users u              
        LEFT JOIN user_follow f ON u.id = f.follow_id
        LEFT JOIN images p ON p.user_id = u.id
        LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
        LEFT JOIN (SELECT x.user_id, COUNT(*) AS commentcount FROM commentaries x GROUP BY x.user_id) c ON c.user_id = u.id
        WHERE f.user_id = 3 OR p.user_id = 3       
        ORDER BY p.date DESC";
SELECT u.username as user, i.image as user_image, p.image, p.date,
            COALESCE ( imgcount.cnt, 0 ) as comments
            FROM users u              
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images p ON p.user_id = u.id
            LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
            LEFT JOIN 
            ( SELECT image_id, COUNT(*) as cnt FROM
                 commentaries 
              GROUP BY image_id  ) imgcount
            ON p.id = imgcount.image_id
            WHERE f.user_id = 3 OR p.user_id = 3       
            ORDER BY p.date DESC