MySQL的限制

帖子 9月 29th, 2009, 9:31 pm

有谁知道我可以在MySQL的呢?

选择的4张照片的限制,从用户的列表

乙二醇:我有用户鲍勃,贾森和控告。他们上传了20张照片。但我只想从他们每人4张照片。

选择photoid从画廊,用户=先令=贾森或用户或用户=起诉

这将使我的所有照片。

选择photoid从画廊,用户=先令=贾森或用户或用户起诉极限= 4

这给我4鲍勃照片,但没有从京城或起诉。

我如何获得12张照片的起诉,从Bob 4日,贾森4和4?我必须使用多个MySQL语句?
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • Anonymous
  • Bot
  • No Avatar
  • 注册: 25 Feb 2008
  • 帖子: ?
  • Loc: Ozzuland
  • Status: Online

帖子 9月 29th, 2009, 9:31 pm

  • Bigwebmaster
  • Site Admin
  • Site Admin
  • 头像
  • 注册: 12月 20, 2002
  • 帖子: 7493
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

帖子 9月 29th, 2009, 10:40 pm

如果是我,我可能会使用这样的语句:

MYSQL 代码: [ Download ] [ Select ]
SELECT photoid, user
FROM galleries
WHERE user IN ('bob', 'jason', 'sue')
ORDER BY photoid DESC
  1. SELECT photoid, user
  2. FROM galleries
  3. WHERE user IN ('bob', 'jason', 'sue')
  4. ORDER BY photoid DESC


我提出的假设这里越高photoid较新的照片。然后,之后,我会使用任何脚本语言,您正在使用它来限制每个用户的结果4。例如:

PHP 代码: [ Download ] [ Select ]
$photoArray = array();
while($row = mysql_fetch_row($result))
{
   if(count($photoArray[$row['user']]) < 4)
   {
      $photoArray[$row['user']][] = $row['photoid'];
   }
}
  1. $photoArray = array();
  2. while($row = mysql_fetch_row($result))
  3. {
  4.    if(count($photoArray[$row['user']]) < 4)
  5.    {
  6.       $photoArray[$row['user']][] = $row['photoid'];
  7.    }
  8. }


这只会增加photoids到指定的用户,只要有不少于4张照片数组。我没有测试过这一点,但它会沿着这些路线的东西。 最后你将同他们的最新照片的ID的用户多维数组,你可以做任何你需要的。
Ozzu Hosting - Want your website on a fast server like Ozzu?
Contact US for more information about our plans and rates

帖子 9月 29th, 2009, 11:06 pm

这将工作。但是我想具体MySQL的声明,只想从每个用户4图片...

Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • joebert
  • Orange Lover
  • Genius
  • 头像
  • 注册: 2月 10, 2004
  • 帖子: 12487
  • Loc: FL
  • Status: Offline

帖子 9月 29th, 2009, 11:08 pm

我所做的继承人。

首先我的测试表。

SQL 代码: [ Download ] [ Select ]
--
-- Table structure for table `gallery`
--
 
CREATE TABLE `gallery` (
  `user` int(11) NOT NULL,
  `photo` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY  (`photo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
 
  1. --
  2. -- Table structure for table `gallery`
  3. --
  4.  
  5. CREATE TABLE `gallery` (
  6.   `user` int(11) NOT NULL,
  7.   `photo` int(11) NOT NULL AUTO_INCREMENT,
  8.   PRIMARY KEY  (`photo`)
  9. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
  10.  


我插入用户1,2和3手动真正快12行。

我尝试这个怪物。

SQL 代码: [ Download ] [ Select ]
SELECT
   a.user,
   a.photo AS aa,
   b.photo AS bb,
   c.photo AS cc,
   d.photo AS dd
FROM gallery a
   LEFT JOIN gallery b
      ON a.user = b.user
         AND a.photo <> b.photo
   LEFT JOIN gallery c
      ON b.user = c.user
         AND a.photo <> b.photo
         AND a.photo <> c.photo
         AND b.photo <> c.photo
   LEFT JOIN gallery d
      ON c.user = d.user
         AND a.photo <> b.photo
         AND a.photo <> c.photo
         AND a.photo <> d.photo
         AND b.photo <> c.photo
         AND b.photo <> d.photo
         AND c.photo <> d.photo
GROUP BY user
  1. SELECT
  2.    a.user,
  3.    a.photo AS aa,
  4.    b.photo AS bb,
  5.    c.photo AS cc,
  6.    d.photo AS dd
  7. FROM gallery a
  8.    LEFT JOIN gallery b
  9.       ON a.user = b.user
  10.          AND a.photo <> b.photo
  11.    LEFT JOIN gallery c
  12.       ON b.user = c.user
  13.          AND a.photo <> b.photo
  14.          AND a.photo <> c.photo
  15.          AND b.photo <> c.photo
  16.    LEFT JOIN gallery d
  17.       ON c.user = d.user
  18.          AND a.photo <> b.photo
  19.          AND a.photo <> c.photo
  20.          AND a.photo <> d.photo
  21.          AND b.photo <> c.photo
  22.          AND b.photo <> d.photo
  23.          AND c.photo <> d.photo
  24. GROUP BY user


得到了与用户标识和4独特的照片3用户每行是属于他们的。

然后,我增加了一个索引用户。

SQL 代码: [ Download ] [ Select ]
--
-- Table structure for table `gallery`
--
 
CREATE TABLE `gallery` (
  `user` int(11) NOT NULL,
  `photo` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY  (`photo`),
  KEY `user` (`user`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
 
  1. --
  2. -- Table structure for table `gallery`
  3. --
  4.  
  5. CREATE TABLE `gallery` (
  6.   `user` int(11) NOT NULL,
  7.   `photo` int(11) NOT NULL AUTO_INCREMENT,
  8.   PRIMARY KEY  (`photo`),
  9.   KEY `user` (`user`)
  10. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
  11.  


然后我插入选男女对表,直到它368K独特的照片列行。

然后,我分配到大约10万人随机用户。

SQL 代码: [ Download ] [ Select ]
UPDATE gallery SET user = ROUND(RAND() * 100000)


然后,我从以前运行怪物,同另外一个WHERE子句

SQL 代码: [ Download ] [ Select ]
SELECT
   a.user,
   a.photo AS aa,
   b.photo AS bb,
   c.photo AS cc,
   d.photo AS dd
FROM gallery a
   LEFT JOIN gallery b
      ON a.user = b.user
         AND a.photo <> b.photo
   LEFT JOIN gallery c
      ON b.user = c.user
         AND a.photo <> b.photo
         AND a.photo <> c.photo
         AND b.photo <> c.photo
   LEFT JOIN gallery d
      ON c.user = d.user
         AND a.photo <> b.photo
         AND a.photo <> c.photo
         AND a.photo <> d.photo
         AND b.photo <> c.photo
         AND b.photo <> d.photo
         AND c.photo <> d.photo
WHERE a.user IN (100, 500, 10000, 25000)
GROUP BY user
  1. SELECT
  2.    a.user,
  3.    a.photo AS aa,
  4.    b.photo AS bb,
  5.    c.photo AS cc,
  6.    d.photo AS dd
  7. FROM gallery a
  8.    LEFT JOIN gallery b
  9.       ON a.user = b.user
  10.          AND a.photo <> b.photo
  11.    LEFT JOIN gallery c
  12.       ON b.user = c.user
  13.          AND a.photo <> b.photo
  14.          AND a.photo <> c.photo
  15.          AND b.photo <> c.photo
  16.    LEFT JOIN gallery d
  17.       ON c.user = d.user
  18.          AND a.photo <> b.photo
  19.          AND a.photo <> c.photo
  20.          AND a.photo <> d.photo
  21.          AND b.photo <> c.photo
  22.          AND b.photo <> d.photo
  23.          AND c.photo <> d.photo
  24. WHERE a.user IN (100, 500, 10000, 25000)
  25. GROUP BY user


它产生在一秒钟就相当旧计算机的结果。进出口恰如其准确,因为我没有任何区别,比其他WHERE子句最初的测试是准确的。

刚好有只有3用户500张照片,因此,第四列是空。
Patience.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • 头像
  • 注册: 12月 20, 2002
  • 帖子: 7493
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

帖子 9月 29th, 2009, 11:18 pm

camperjohn 写道:
这将工作。但是我想具体MySQL的声明,只想从每个用户4图片...



据我所知,就没有这样简单的声明。你必须做一些不喜欢Joebert以上。与Joeberts解决方案的问题是,如果在路上你想改变它从用户显示8,10或20张照片,MySQL的声明将得到更为复杂。 有时是有道理的使用一些简单的MySQL的编码表,帮助。这就是我会做,除非你的MySQL语句返回的结果可能数百万,使PHP循环可能是非常耗时那么,它可能更合理的限制,例如不一样Joeberts返回的结果。
Ozzu Hosting - Want your website on a fast server like Ozzu?
Contact US for more information about our plans and rates

帖子 9月 29th, 2009, 11:25 pm

是的,我想我只作一个foreach循环,而不是让MySQL的去做。

当我要选择8张照片,从2500年的用户,MySQL的声明将非常可怕的。
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • joebert
  • Orange Lover
  • Genius
  • 头像
  • 注册: 2月 10, 2004
  • 帖子: 12487
  • Loc: FL
  • Status: Offline

帖子 9月 30th, 2009, 9:03 am

进出口兴趣了解什么会更有效的现场直播,

1)多个查询
2)函数生成的怪物查询

事实上,我有这种对我就放心了几天,我想拉一个类别数目可变的列配置的数量,当我到达的地盘/类别索引页的东西前回的问题。
Patience.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • 头像
  • 注册: 12月 20, 2002
  • 帖子: 7493
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

帖子 9月 30th, 2009, 9:18 am

根据我的经验怪物的查询,往往未能效率,二更有效的查询。 然而,它实际上取决于有多少结果被返回,你最终如何处理数据,如果怪物查询创建这样的事情:

Quote:
使用临时;使用filesort


当使用它锁定整个表的临时表(如果使用MyISAM引擎),如果你有很多的要求正在使事情可以很快备份如果怪物没有完成查询并返回一个快许多重要成果。 这可能最终导致整个服务器如果你有大量的流量。这是一个原因,我更喜欢有两个快速查询并把PHP的负载提供帮助。另外还有一点值得注意的是,一些临时表在内存中创建(快),而有些过大是在磁盘上创建(很慢)。 因此,如果你有一个查询,它使用磁盘上创建临时表,该表可以锁定很长一段时间,这意味着所有试图访问该表将被搁置,直到完成。不好。

临时表并不总是可怕的事,只要如果查询时间过长完成。有时,临时表是必要的,通常是非常有效的查询不错。 下面是一个相当不错的文章:

http://www.sql-server-performance.com/a ... es_p1.aspx

我很好奇什么是您的查询将返回Joebert解释。
Ozzu Hosting - Want your website on a fast server like Ozzu?
Contact US for more information about our plans and rates
  • joebert
  • Orange Lover
  • Genius
  • 头像
  • 注册: 2月 10, 2004
  • 帖子: 12487
  • Loc: FL
  • Status: Offline

帖子 9月 30th, 2009, 9:55 am

进出口思考现在,我认为唯一的理由是这样做的怪物查询与30万+行,就是在WHERE子句,并在用户大大降低列索引的列数为加入抓住。

我的测试表有30万行,但与任何相关的照片最多的用户人数为14。

SQL 代码: [ Download ] [ Select ]
SELECT COUNT( photo ) AS total
FROM `gallery`
GROUP BY user
ORDER BY total DESC
LIMIT 1
  1. SELECT COUNT( photo ) AS total
  2. FROM `gallery`
  3. GROUP BY user
  4. ORDER BY total DESC
  5. LIMIT 1


因此,我插入选男女表的大小,以150万行,那么我减少了用户ID数量25K型。

同样的怪物查询看起来它会花几分钟的时间回到这个新的表什么。我只是重新启动MySQL服务器,所以我可以找出任何行的最大用户数为94。
Patience.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • 头像
  • 注册: 12月 20, 2002
  • 帖子: 7493
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

帖子 9月 30th, 2009, 10:03 am

此外当你有机会发布您的解释,该怪物查询结果:

SQL 代码: [ Download ] [ Select ]
EXPLAIN SELECT
   a.user,
   a.photo AS aa,
   b.photo AS bb,
   c.photo AS cc,
   d.photo AS dd,
...
 
  1. EXPLAIN SELECT
  2.    a.user,
  3.    a.photo AS aa,
  4.    b.photo AS bb,
  5.    c.photo AS cc,
  6.    d.photo AS dd,
  7. ...
  8.  
Ozzu Hosting - Want your website on a fast server like Ozzu?
Contact US for more information about our plans and rates
  • joebert
  • Orange Lover
  • Genius
  • 头像
  • 注册: 2月 10, 2004
  • 帖子: 12487
  • Loc: FL
  • Status: Offline

帖子 9月 30th, 2009, 10:26 am

这是从一个表中的110席,并在21用户行的副本。
这怪物的查询是真的带着150万行的一段时间。

代码: [ Download ] [ Select ]
+----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref     | rows | Extra    |
+----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
| 1 | SIMPLE   | a   | range | user     | user | 4    | NULL    |  18 | Using where |
| 1 | SIMPLE   | b   | ref  | user     | user | 4    | test.a.user |  12 |       |
| 1 | SIMPLE   | c   | ref  | user     | user | 4    | test.b.user |  12 |       |
| 1 | SIMPLE   | d   | ref  | user     | user | 4    | test.c.user |  12 |       |
+----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
4 rows in set (0.00 sec)
  1. +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
  2. | id | select_type | table | type | possible_keys | key | key_len | ref     | rows | Extra    |
  3. +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
  4. | 1 | SIMPLE   | a   | range | user     | user | 4    | NULL    |  18 | Using where |
  5. | 1 | SIMPLE   | b   | ref  | user     | user | 4    | test.a.user |  12 |       |
  6. | 1 | SIMPLE   | c   | ref  | user     | user | 4    | test.b.user |  12 |       |
  7. | 1 | SIMPLE   | d   | ref  | user     | user | 4    | test.c.user |  12 |       |
  8. +----+-------------+-------+-------+---------------+------+---------+-------------+------+-------------+
  9. 4 rows in set (0.00 sec)
Patience.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • 头像
  • 注册: 12月 20, 2002
  • 帖子: 7493
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

帖子 9月 30th, 2009, 10:50 am

哇,让用户有21小桌子,要求你仍然可以搜寻31104行。你认为该乘以解释所有的行在一起。因此,18x12x12x12 = 31104。我不知道有多少会搜索如果你有10000用户。
Ozzu Hosting - Want your website on a fast server like Ozzu?
Contact US for more information about our plans and rates
  • joebert
  • Orange Lover
  • Genius
  • 头像
  • 注册: 2月 10, 2004
  • 帖子: 12487
  • Loc: FL
  • Status: Offline

帖子 9月 30th, 2009, 11:20 am

另一种情况下以任何方式你看看,一个班轮只是不是一种选择。它可能对谁好工作只有少数几个用户的照片,但是当你见过吗?
Patience.

帖子 9月 30th, 2009, 2:48 pm

我的表的大小约为40000画廊,100,000 +图像和视频,约35,000名。许多成员都0张照片。
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery

帖子 10月 8th, 2009, 7:34 am

日thanx for分享知识的充分利用我




:)
  • Anonymous
  • Bot
  • No Avatar
  • 注册: 25 Feb 2008
  • 帖子: ?
  • Loc: Ozzuland
  • Status: Online

帖子 10月 8th, 2009, 7:34 am

发布信息

  • 总员额在本主题: 16 篇帖子
  • 正在浏览此版面的用户:没有注册用户 和 259 位游客
  • 不能 在这个版面发表主题
  • 不能 在这个版面回复主题
  • 不能 在这个版面编辑帖子
  • 不能 在这个版面删除帖子
  • 不能 在这个版面提交附件
 
 

© 2010 Unmelted, LLC. 驱动 phpBB © 2010 phpBB Group.