Selección de la última fila de registro con distintos parámetros -- mysql campo con select campo con group-by campo con distinct campo con union camp Relacionados El problema

Selecting latest row of record with distinct parameter


0
vote

problema

Español

Quiero seleccionar una lista de registros no duplicados, que invise a un determinado usuario (ya sea en user_to o user_from ). Quiero recuperar al otro usuario y también el último contenido en ese registro. La lista no debe tener duplicaciones en el otro usuario seleccionado.

Por ejemplo, tengo el siguiente conjunto de registros

  id   user_to   user_from   content     time 1      1          2          ABC    2013-11-05   2      4          2          BBC    2013-11-06   3      3          1          CBC    2013-11-07   4      5          1          ABC    2013-11-08  5      1          2          AAC    2013-11-09   6      5          1          ABB    2013-11-10  7      3          4          CBC    2013-11-11   8      1          2          ACC    2013-11-12    

En este caso, si el parámetro para proporcionar es 1, quiero seleccionar grabar 3,6,8 , los otros no se seleccionan porque tampoco están duplicados y mayores o no involucran 1 . He buscado en esta publicación y probé algo como esto:

   SELECT u, content, date FROM(        (SELECT                  user_from AS u,                  MAX(time) AS date,                  content             FROM t1                  WHERE user_to = :user              )                  UNION             (SELECT                  user_to AS u,                  MAX(time) AS date,                  content             FROM t1                   WHERE user_from = :user              )          ) t2 WHERE date IN (SELECT MAX(date) FROM t2 GROUP BY u)   

pero no, no puedo hacerlo.

¿Alguna idea de cómo escribir la consulta? ¡Gracias!

Original en ingles

I want to select a list of non-duplicate records, that invlove a certain user (either in user_to or user_from). I want to retrieve the other user and also the latest content in that record. The list must not have duplications in the other user selected.

For example, I have the following set of records

id   user_to   user_from   content     time 1      1          2          ABC    2013-11-05   2      4          2          BBC    2013-11-06   3      3          1          CBC    2013-11-07   4      5          1          ABC    2013-11-08  5      1          2          AAC    2013-11-09   6      5          1          ABB    2013-11-10  7      3          4          CBC    2013-11-11   8      1          2          ACC    2013-11-12  

In this case, If the parameter to provide is 1, I want to select record 3,6,8 , the others are not selected because either they are duplicated and older or they do not involve 1. I have looked into this post and tried something like this:

 SELECT u, content, date FROM(        (SELECT                  user_from AS u,                  MAX(time) AS date,                  content             FROM t1                  WHERE user_to = :user              )                  UNION             (SELECT                  user_to AS u,                  MAX(time) AS date,                  content             FROM t1                   WHERE user_from = :user              )          ) t2 WHERE date IN (SELECT MAX(date) FROM t2 GROUP BY u) 

But no, can't get it done.

Any idea how to write the query? Thanks!

              
         
         

Lista de respuestas

0
 
vote

Su consulta debe ser esto:

   select m.* from   message m,  ( select user_to,           user_from,            max(dtime) mxdate       from message      where user_from = 1 or user_to = 1     group by user_to, user_from) m2  where m.dtime = m2.mxdate    and (m.user_from = 1 or m.user_to = 1)   

Véalo aquí en Fiddle: http://sqlfiddle.com/#!/13d4e/ 4

Como usted pregunta en comentarios: OK. Pero como solo quiero el User_ID del otro usuario, ¿hay una manera de seleccionar solo User_to cuando User_from = 1 y User_from cuando user_to = 1?

  select if(m.user_to=1,m.user_from,m.user_to) as user,         m.content,         m.dtime   from      message m,     ( select user_to,              user_from,               max(dtime) mxdate          from message         where user_from = 1 or user_to = 1        group by user_to, user_from) m2  where m.dtime = m2.mxdate    and (m.user_from = 1 or m.user_to = 1)   

Véalo aquí: http://sqlfiddle.com/#!/13D4E/5 < / a>

 

Your query should be this:

 select m.* from   message m,  ( select user_to,           user_from,            max(dtime) mxdate       from message      where user_from = 1 or user_to = 1     group by user_to, user_from) m2  where m.dtime = m2.mxdate    and (m.user_from = 1 or m.user_to = 1) 

See it here at fiddle: http://sqlfiddle.com/#!2/13d4e/4

As you ask in comments: ok. but as I only want the user_id of the other user, is there a way to select only user_to when user_from=1 and user_from when user_to=1 ?

select if(m.user_to=1,m.user_from,m.user_to) as user,         m.content,         m.dtime   from      message m,     ( select user_to,              user_from,               max(dtime) mxdate          from message         where user_from = 1 or user_to = 1        group by user_to, user_from) m2  where m.dtime = m2.mxdate    and (m.user_from = 1 or m.user_to = 1) 

see it here: http://sqlfiddle.com/#!2/13d4e/5

 
 
         
         
0
 
vote
  DROP TABLE IF EXISTS my_table;  CREATE TABLE my_table (id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,user_to   INT NOT NULL ,user_from INT NOT NULL   ,content   CHAR(3) NOT NULL   ,dt DATE NOT NULL );  INSERT INTO my_table VALUES (1,1,2,'ABC','2013-11-05'), (2,4,2,'BBC','2013-11-06'), (3,3,1,'CBC','2013-11-07'), (4,5,1,'ABC','2013-11-08'), (5,1,2,'AAC','2013-11-09'), (6,5,1,'ABB','2013-11-10'), (7,3,4,'CBC','2013-11-11'), (8,1,2,'ACC','2013-11-12');   SELECT x.*    FROM my_table x    JOIN       ( SELECT LEAST(user_to,user_from) l             , GREATEST(user_to,user_from) g             , MAX(dt) max_dt FROM my_table          GROUP             BY LEAST(user_to,user_from)             , GREATEST(user_to,user_from)      ) y      ON y.l = LEAST(x.user_to,x.user_from)     AND y.g = GREATEST(x.user_to,x.user_from)     AND y.max_dt = x.dt   WHERE 1 IN (x.user_to,x.user_from); +----+---------+-----------+---------+------------+ | id | user_to | user_from | content | dt         | +----+---------+-----------+---------+------------+ |  3 |       3 |         1 | CBC     | 2013-11-07 | |  6 |       5 |         1 | ABB     | 2013-11-10 | |  8 |       1 |         2 | ACC     | 2013-11-12 | +----+---------+-----------+---------+------------+   
 
DROP TABLE IF EXISTS my_table;  CREATE TABLE my_table (id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,user_to   INT NOT NULL ,user_from INT NOT NULL   ,content   CHAR(3) NOT NULL   ,dt DATE NOT NULL );  INSERT INTO my_table VALUES (1,1,2,'ABC','2013-11-05'), (2,4,2,'BBC','2013-11-06'), (3,3,1,'CBC','2013-11-07'), (4,5,1,'ABC','2013-11-08'), (5,1,2,'AAC','2013-11-09'), (6,5,1,'ABB','2013-11-10'), (7,3,4,'CBC','2013-11-11'), (8,1,2,'ACC','2013-11-12');   SELECT x.*    FROM my_table x    JOIN       ( SELECT LEAST(user_to,user_from) l             , GREATEST(user_to,user_from) g             , MAX(dt) max_dt FROM my_table          GROUP             BY LEAST(user_to,user_from)             , GREATEST(user_to,user_from)      ) y      ON y.l = LEAST(x.user_to,x.user_from)     AND y.g = GREATEST(x.user_to,x.user_from)     AND y.max_dt = x.dt   WHERE 1 IN (x.user_to,x.user_from); +----+---------+-----------+---------+------------+ | id | user_to | user_from | content | dt         | +----+---------+-----------+---------+------------+ |  3 |       3 |         1 | CBC     | 2013-11-07 | |  6 |       5 |         1 | ABB     | 2013-11-10 | |  8 |       1 |         2 | ACC     | 2013-11-12 | +----+---------+-----------+---------+------------+ 
 
 
0
 
vote

Si el filtrado es "1", agregue esto a la consulta de @jorge Campos

  where user_from = 1 OR user_to=1   
 

if filtering is "1" add this to the query of @Jorge Campos

where user_from = 1 OR user_to=1 
 
 
   
   

Relacionados problema

2  Comparando los valores de la columna en un cuadro de datos de Pandas  ( Comparing column values in a pandas dataframe ) 
Necesito encontrar dónde se diferencien los valores de la columna en un contexto de Pandas Dado. He reunido mi estructura de datos usando técnicas describe ...

12  ¿Cómo puedo tratar una consulta sindical como una subcha secundaria?  ( How can i treat a union query as a sub query ) 
Tengo un conjunto de tablas que son lógicamente una tabla dividida en piezas por razones de rendimiento. Necesito escribir una consulta que se une eficazmente...

-1  Formato de resultados que se utilizarán en un gráfico en el constructor de informes  ( Formatting results to be used in a graph in report builder ) 
Estoy tratando de mostrar gráficamente los 12 meses anteriores de MTBF por mes en el constructor de informes. Tuve los resultados en la consulta de SQL mostra...

1  Conversión de una consulta de unión en MySQL  ( Converting a union query in mysql ) 
Tengo una tabla muy grande (8 GB) con información sobre archivos, y necesito ejecutar un informe en su contra que se vería como esto: (select * from fs_wal...

0  MySQL: Orden por valor de la segunda tabla, use el valor predeterminado si no se establece el valor  ( Mysql order by value from second table use default if value not set ) 
Esto tiene lugar dentro de WordPress, pero es una pregunta general de MySQL. Hay dos tablas, una de las cuales contiene postes, los otros metadatos, vincula...

22  ¿Cómo concate los conjuntos de resultados enteros en MySQL?  ( How do i concatenate entire result sets in mysql ) 
Estoy probando la siguiente consulta: SELECT A,B,C FROM table WHERE field LIKE 'query%' UNION SELECT A,B,C FROM table WHERE field LIKE '%query' UNION SELEC...

0  Nombre de columna no válido 'calanderdate'. Al usar A con y una unión  ( Invalid column name calanderdate when using a with and a union ) 
Tengo la siguiente consulta: WITH Calender AS ( SELECT @FromDate AS CalanderDate UNION ALL SELECT CalanderDate + 1 FROM Calender WHERE Cal...

1  ¿Cómo creo un sindicato de clase CSS?  ( How do i create a css class union ) 
Tengo un div que las clases de los sindicatos CSS como tal: <div id="tp" class="ui-hidden-on-load ui-tablepicker ui-widget ui-widget-content ui-helper-...

4  Selección de puntos duplicados en una lista de datos  ( Selecting duplicate points on a list of data ) 
Estoy tratando de dejar caer algunos elementos de una lista de datos en Mathematica, pero no entiendo cómo Select Union trabaja. Por ejemplo, supongamos qu...

2  Cómo obtener la unión de dos conjuntos de objetos que heredan de una clase común  ( How to get the union of two sets of objects that inherit from a common class ) 
Di que tengo dos clases, avión y automóvil, que ambos heredan del vehículo public class Vehicle { } public class Car : Vehicle { } public class Plane : V...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos