Límites de MySQL

  • camperjohn
  • Guru
  • Guru
  • Avatar de Usuario
  • Registrado: Nov 28, 2004
  • Mensajes: 1127
  • Loc: San Diego
  • Status: Offline

Nota Septiembre 29th, 2009, 9:31 pm

¿Alguien sabe cómo puedo hacer esto en mysql?

Seleccione un límite de 4 fotografías, de una lista de usuarios de

EG: Tengo usuarios de Bob, Jason y demanda. Se han subido cerca de 20 fotos cada uno. Pero sólo quiero 4 fotos de cada uno de ellos.

SELECCIONAR galerías de photoid WHERE user = usuario o Bob = Jason o usuario = demandar

Esto me dará todas sus fotos.

SELECCIONAR galerías de photoid WHERE user = usuario o Bob = Jason o usuario = demandar LIMIT 4

Esto me dará 4 fotos de Bob, pero nada de Jason o demandar.

¿Cómo puedo obtener 12 fotos, 4 de Bob, 4 de Jason, y 4 de demandar? ¿Debo usar múltiples sentencias de MySQL?
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Septiembre 29th, 2009, 9:31 pm

  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8934
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Septiembre 29th, 2009, 10:40 pm

Si fuera yo utilizaría probablemente un comando como este:

MYSQL Código: [ 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


Estoy haciendo el supuesto de aquí que el más alto es el Número de foto la nueva la foto. Luego, después de que iba a utilizar cualquier lenguaje de scripts que utiliza para limitarlo a los 4 resultados por usuario. Por ejemplo:

PHP Código: [ 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. }


Eso sólo photoids añadir a la matriz de los usuarios especificados, siempre que cuenten con menos de 4 fotos. No he probado esto, pero sería algo a lo largo de estas líneas. Al final, usted tendría una matriz multidimensional de los usuarios con sus documentos de identidad última foto que podía hacer lo que usted necesita con.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • camperjohn
  • Guru
  • Guru
  • Avatar de Usuario
  • Registrado: Nov 28, 2004
  • Mensajes: 1127
  • Loc: San Diego
  • Status: Offline

Nota Septiembre 29th, 2009, 11:06 pm

Que iba a funcionar. Pero yo estaba pensando en una declaración específica de MySQL que sólo obtendría 4 imagenes de cada usuario...

Hmm
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Septiembre 29th, 2009, 11:08 pm

Heres lo que hice.

En primer lugar mi tabla de prueba.

SQL Código: [ 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.  


He insertado 12 filas para los usuarios de 1, 2 y 3 de forma manual muy rápido.

Traté este monstruo.

SQL Código: [ 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


¿Tienes una fila para cada uno de los 3 a los usuarios con nombre de usuario y 4 fotos únicas que les pertenecía.

Luego he añadido un índice para los usuarios.

SQL Código: [ 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.  


Entonces INSERT-SELECT-ed la mesa hasta que se 368K filas con columnas foto única.

Luego me asignados a cerca de los 100K usuarios al azar.

SQL Código: [ Select ]
UPDATE gallery SET user = ROUND(RAND() * 100000)


Luego corrí el monstruo de antes, con la adición de una cláusula WHERE

SQL Código: [ 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


Se devuelven los resultados en una fracción de segundo en un equipo bastante viejo. Im asumiendo su exacta porque mi primera prueba con otra diferencia que la cláusula WHERE era exacta.

No pasó a ser sólo 3 fotos para el usuario 500, por lo que la columna 4 ª era NULL.
Strong with this one, the sudo is.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8934
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Septiembre 29th, 2009, 11:18 pm

camperjohn escribió:
Que iba a funcionar. Pero yo estaba pensando en una declaración específica de MySQL que sólo obtendría 4 imagenes de cada usuario...

Hmm


Por lo que yo soy consciente de que no habría declaración tan simple. Usted tendría que hacer algo como joebert hizo anteriormente. El problema con Joeberts solución es que si por el camino que desea cambiar para mostrar 8, 10 o 20 fotos de los usuarios que la declaración de MySQL será mucho más complicado. A veces tiene sentido utilizar MySQL con simples declaraciones de algunos de codificación para ayudar. Eso es lo que yo haría a menos que su declaración de MySQL está volviendo potencialmente millones de resultados, ese sistema de PHP puede ser bastante tiempo después y puede tener más sentido de limitar los resultados devueltos Joeberts como ejemplo lo hace.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • camperjohn
  • Guru
  • Guru
  • Avatar de Usuario
  • Registrado: Nov 28, 2004
  • Mensajes: 1127
  • Loc: San Diego
  • Status: Offline

Nota Septiembre 29th, 2009, 11:25 pm

Sí creo que voy a hacer un bucle foreach y no dejar que MySQL hacerlo.

Cuando tengo que seleccionar 8 fotos, a partir de 2500 los usuarios, la declaración de MySQL será horrendo.
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Septiembre 30th, 2009, 9:03 am

Estoy interesado en saber lo que sería más eficiente en un sitio vivo,

Varias consultas 1)
2) una función que genera que la consulta de monstruo

Tenía realmente este problema en el fondo de mi mente un par de días que quiera sacar un número configurable de columnas para un número variable de categorías cuando llego a hacer el sitio / índice de materia categoría de página.
Strong with this one, the sudo is.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8934
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Septiembre 30th, 2009, 9:18 am

En mis consultas monstruo experiencia no suelen ser tan eficientes como dos consultas más eficientes. Sin embargo, realmente depende de cómo los resultados de muchos se están devolviendo, como se llega a procesar los datos, y si la consulta de monstruo crea cosas como esta:

Quote:
Uso temporal; Uso filesort


Al utilizar las tablas temporales que se bloquee la tabla completa (si está usando el motor MyISAM) y si usted tiene una gran cantidad de solicitudes que se hacían las cosas pueden conseguir una copia de seguridad muy rápidamente en caso de que la consulta de monstruo no es el acabado rápido y el retorno de una gran cantidad de resultados. Que eventualmente podría provocar la caída de todo el servidor si usted tiene una gran cantidad de tráfico. Esa es una razón por la que prefieren tener dos consultas más rápida y poner la carga en PHP para ayudar. También otra cosa para notar es que algunas tablas temporales se crean en la memoria (rápida), mientras que otros que son demasiado grandes se crean en el disco (muy lento). Así que si tienes una consulta que se utilizan tablas temporales creadas en el disco, la tabla podría ser bloqueada por un largo tiempo lo que significa que todo lo que tratan de acceder a esa tabla será en suspenso hasta que se termine. No es bueno.

Las tablas temporales no siempre son una cosa horrible, sólo si la consulta tarda demasiado tiempo en completarse. A veces, las tablas temporales son necesarias y son generalmente bien con consultas muy eficiente. Aquí está un artículo bastante bueno:

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

Sería curioso qué explicar en su consulta devolverá joebert.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Septiembre 30th, 2009, 9:55 am

Im pensar en ello ahora, y creo que la única razón de que la consulta de monstruo le fue tan bien con 300K + filas, es que en la cláusula y el índice en la columna de usuario reducido considerablemente el número de columnas que se apoderó de las juntas.

Mi tabla de prueba había 300K filas, pero el número máximo de fotos relacionadas con cualquier usuario de 14 años.

SQL Código: [ 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


Así que me INSERT-SELECT-ed el tamaño de la tabla a 1,5 M filas, entonces reducido el número de identificadores de usuario que 25K.

Esa consulta mismo monstruo se parece a su va a tomar varios minutos para volver nada con esta nueva tabla. Acabo de reiniciar el servidor MySQL para que yo pudiera averiguar el número máximo de filas de cualquier usuario tiene es de 94.
Strong with this one, the sudo is.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8934
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Septiembre 30th, 2009, 10:03 am

Además, cuando tienes la oportunidad de su puesto de explicar los resultados de esa consulta de monstruo:

SQL Código: [ 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?
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Septiembre 30th, 2009, 10:26 am

Esto es de una copia de la tabla de la galería con 110 filas y 21 usuarios.
Consulta de monstruo que realmente va a tomar un rato con 1,5 M filas.

Código: [ 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)
Strong with this one, the sudo is.
  • Bigwebmaster
  • Site Admin
  • Site Admin
  • Avatar de Usuario
  • Registrado: Dic 20, 2002
  • Mensajes: 8934
  • Loc: Seattle, WA & Phoenix, AZ
  • Status: Offline

Nota Septiembre 30th, 2009, 10:50 am

Vaya a fin de que el cuadro pequeño con 21 usuarios requieren que todavía búsqueda 31.104 filas. Tienes que multiplicando todos juntos en las filas que explicar. Así 18x12x12x12 = 31.104. Me pregunto cuántos de búsqueda sería si usted tiene 10.000 usuarios.
Ozzu Hosting - Want your website on a fast server like Ozzu?
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Septiembre 30th, 2009, 11:20 am

Otro caso en la forma que se mire, una sola línea simplemente no es una opción. Puede que funcione bien para que varios usuarios que sólo tienen unas pocas fotos, pero cuando usted ve que?
Strong with this one, the sudo is.
  • camperjohn
  • Guru
  • Guru
  • Avatar de Usuario
  • Registrado: Nov 28, 2004
  • Mensajes: 1127
  • Loc: San Diego
  • Status: Offline

Nota Septiembre 30th, 2009, 2:48 pm

Mi tamaño de la tabla es de aproximadamente 40.000 galerías, 100.000 + imágenes y vídeos, y cerca de 35.000 miembros. Muchos miembros han 0 fotos.
Upload video and picture galleries at http://www.bodydot.com?post+upload+video+picture+gallery
  • Unisys Systems
  • Born
  • Born
  • No Avatar
  • Registrado: Oct 08, 2009
  • Mensajes: 1
  • Status: Offline

Nota Octubre 8th, 2009, 7:34 am

Dar gracias por compartir los conocimientos de su uso completo para mí




:)
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Octubre 8th, 2009, 7:34 am

Publicar Información

  • Total de mensajes en este tema: 16 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 200 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC