【问题标题】:Mysql count columnsMysql 统计列数
【发布时间】:2010-05-04 11:04:30
【问题描述】:

我有一个包含四列的图片库表,例如:

foid | uid | pic1  | pic2  | pic3  | date     |
-----------------------------------------------
104  |  5  | 1.jpg | 2.jpg | 3.jpg | 2010-01-01
105  | 14  | 8.jpg |       |       | 2009-04-08
106  | 48  | x.jpg | y.jpg |       | 2010-08-09

用户画廊的Mysql查询如下:

SELECT * FROM foto WHERE uid = $id order by foid DESC

我想做的是计算每个列出的画廊中的图像数量(PIC1、PIC2、PIC3)。

最好的方法是什么?

【问题讨论】:

  • 最好的方法是标准化你的数据库。这是一个选择吗?
  • “无图片”如何存储?作为 NULL 还是空字符串?
  • @Sergei:列类型是什么?字符(n)? VARCHAR(n)?还有什么?

标签: select mysql count


【解决方案1】:

我假设每个foid 代表一个画廊:

SELECT foid, uid, date,
       (CASE WHEN pic1 IS NULL THEN 0 ELSE 1 END +
        CASE WHEN pic2 IS NULL THEN 0 ELSE 1 END +
        CASE WHEN pic3 IS NULL THEN 0 ELSE 1 END
       ) AS pic_count
  FROM foto
 WHERE uid = $id
 ORDER BY foid DESC

顺便说一下,这不是一种特别合理的架构架构方式。您真的应该将图片拆分为单独的表格:

foto:
foid | uid | date
-----------------------
104  |  5  | 2010-01-01
105  | 14  | 2009-04-08
106  | 48  | 2010-08-09

pic:
foid | pic
------------
104  | 1.jpg
104  | 2.jpg
104  | 3.jpg
105  | 8.jpg
106  | x.jpg
106  | y.jpg

现在,画廊可以有超过三张图片,查询更简单:

SELECT foid, uid, date, COUNT(*)
  FROM foto
  JOIN pic USING (foid)
 WHERE uid = $id
 ORDER BY foid DESC
 GROUP BY foid, uid, date

编辑:您可以这样拆分现有数据库(只是猜测列类型之类的东西):

CREATE TABLE picture (foid INT, pic VARCHAR(255));

INSERT INTO picture (foid, pic)
        SELECT foid, pic1 as pic FROM foto WHERE pic IS NOT NULL
        UNION
        SELECT foid, pic2 as pic FROM foto WHERE pic IS NOT NULL
        UNION
        SELECT foid, pic3 as pic FROM foto WHERE pic IS NOT NULL
    ;

ALTER TABLE foto
    DROP COLUMN pic1,
    DROP COLUMN pic2,
    DROP COLUMN pic3
    ;

显然,删除列时应格外小心,并在开始之前进行备份!

【讨论】:

  • 谢谢马塞洛。问题是现在拆分表为时已晚,因为有超过 5000 条记录。或者你认为有办法做到这一点?
  • 5000 条记录不算什么,拆分很容易(我会更新答案)。通常的痛点是您必须重写的代码量。
  • 如果有一种简单的方法可以做到这一点,那就太好了。谢谢!
  • 谢谢。我去做。如果我像您所说的那样查询 MySql 以获取所有不同用户画廊和其中所有图片的列表,它不会占用太多服务器资源?这是在 MySql 数据库中存储和列出图像的更“服务器友好”的方式?
  • 5000 * 3 条记录甚至不会对 MS Access 造成压力。
猜你喜欢
  • 2014-10-10
  • 2016-12-30
  • 2011-03-31
  • 2014-02-09
  • 2020-10-21
  • 2011-09-02
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多