2012-07-25 23 views
41

Lo siento mucho si la pregunta parece demasiado básica.
He navegado por Internet completo y StackOverflow para encontrar una solución completa, y no encontré nada que pueda entender, y no puedo escribirlo, así que tengo que preguntarlo aquí.
MySQL - SELECCIONE todas las columnas DONDE una columna es DISTINCT

Tengo una base de datos MySQL.
Tiene una tabla llamada "publicado".
Tiene 8 columnas.

necesito para dar salida a este resultado:

SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month 

pero necesito no sólo la columna de "enlace", sino también otras columnas para esta fila.
Al igual que para cada fila devuelta con esta consulta También necesito conocer su "id" en la tabla, "día" y los valores "mes", etc.

Por favor, dime lo que debo leer para hacerlo, o como hacerlo.
Por favor, mantenlo lo más simple posible, ya que no soy un experto en MySQL.

Editar: yo probamos este:

SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month 

No funciona. Devuelve demasiadas filas. Supongamos que hay 10 filas con los mismos enlaces, pero diferentes día/mes/id. Este script devolverá los 10 y solo quiero el primero (para este enlace).

+0

No entiendo muy bien lo que quiere lograr. Si '' DISTINCT link', el valor de otras columnas es vago. No puedes simplemente seleccionar otras columnas. ¿Puedes explicar un poco más? – mask8

+0

PUEDE simplemente seleccionar otras columnas vagas si desea una única entrada arbitraria que tenga esa descripción. Ejemplo: elige un ganador de lotería; extraer una entrada de procesamiento de un grupo; etc. OP es preciso. – DragonLord

Respuesta

2
SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month 

O

SELECT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month 
+0

Maldición, fuiste más rápido que yo: P – Zonata

+0

jajaja, tengo que admitir, eso fue bastante rápido: x – mlishn

+0

+1 por ser el primero;) – Zonata

1
SELECT OTHER_COLUMNS FROM posted WHERE link in (
    SELECT DISTINCT link FROM posted WHERE ad='$key') 
    ORDER BY day, month 
2

Si desea que todas las columnas en las que es único enlace:

SELECT * FROM posted WHERE link in 
    (SELECT link FROM posted WHERE ad='$key' GROUP BY link); 
7

He intentado esto:

SELECT DISTINCT link,id,day,month FROM posted 
    WHERE ad='$key' ORDER BY day, month 

No funciona. Devuelve demasiadas filas. Supongamos que hay 10 filas con mismos enlaces, pero diferentes día/mes/id. Este script devolverá todos 10, y solo quiero el primero (para este enlace).

Lo que estás preguntando no tiene sentido.

O desea que el valor distinto de todos link, id, day, month, o necesita encontrar un criterio para elegir cuál de los valores de id, day, month que desea utilizar, si lo que desea es a lo sumo un valor distinto de link.

De lo contrario, lo que está buscando es similar a MySQL's hidden columns in GROUP BY/HAVING statements, que es SQL no estándar, y en realidad puede ser bastante confuso.

De hecho, podría utilizar un GROUP BY link si tiene sentido elegir cualquier fila para un valor dado link.

Alternativamente, se puede utilizar un sub-select para recoger la fila con el mínimo id de cada valor link (como se describe en this answer):

SELECT link, id, day, month FROM posted 
    WHERE (link, id) IN 
      (SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link) 
+0

¡Impresionante, hombre! Me sorprende que no haya una mejor manera de hacer una operación tan común en MySQL. En Postgres, tenemos 'DISTINCT ON (...)' que logra esto muy bien. –

3

Si lo que su venta es para mostrar sólo las filas que tienen 1 link para ellos entonces se puede utilizar lo siguiente:

SELECT * FROM posted WHERE link NOT IN 
(SELECT link FROM posted GROUP BY link HAVING COUNT(LINK) > 1) 

de nuevo, esto es suponiendo que usted quiere cortar cualquier cosa que tenga un enlace duplicado.

72

El problema proviene de creer instintivamente que DISTINCT es un pre-modificador local para una columna.

Por lo tanto, "debe" ser capaz de escribir

XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX

y tienen que volver valores únicos para col 2. Lamentablemente, no.DISTINCT es en realidad un post-modificador global para SELECT, es decir, a diferencia de SELECT ALL (devolviendo todas las respuestas) es SELECT DISTINCT (devolviendo todas las respuestas únicas). Entonces, un solo DISTINCT actúa en TODAS las columnas que le das.

Esto hace que sea realmente difícil de usar DISTINCT en una sola columna, mientras que obtener las otras columnas, sin hacer saltos mortales muy feo.

La respuesta correcta es utilizar un GROUP BY en las columnas que desea tener respuestas únicas: SELECT col1, col2 FROM mytable GROUP BY col2 le dará arbitrarias únicas col2 filas, con sus datos de col1 también.

+2

Group by es donde está en !! –

+1

¿Cómo se determina si obtiene la primera fila de la columna que es única o la última fila de la columna que es única? – CMCDragonkai

+0

@CMCDragonkai: Lea amablemente el manual. SELECT devuelve TODAS las filas que coinciden con su consulta. El orden puede ser aleatorio y nunca está garantizado; use una cláusula ORDER BY si necesita lo contrario. Ver [http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort-order](http://stackoverflow.com/questions/1793147/sql-best-practice -to-deal-with-default-sort-order). Buena suerte. – DragonLord

-1

Seleccione la datecolumn del mes para que u puede conseguir sólo una fila por cada enlace, por ejemplo:

select link, min(datecolumn) from posted WHERE ad='$key' ORDER BY day, month 

Buena suerte ............

O

u si tiene una columna de fecha como marca de tiempo convertir el formato a la fecha y realizar distinciones en el enlace para que pueda obtener valores de enlace distintos basados ​​en fecha en lugar de fecha

0

Tuve un problema similar, tal vez lp a alguien, por ejemplo - tabla con 3 columnas

SELECT * FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC 

o

SELECT Data_Id, Data_Text, Data_Name FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC 

Dos maneras funciona para mí.

2
SELECT Id, Link, Day, Month FROM Posted 
WHERE Id IN(
    SELECT Min(Id) FROM Posted GROUP BY Link) 
1

Creo que la mejor solución sería hacer una subconsulta y luego unir eso a la mesa. La consulta secundaria devolvería la clave principal de la tabla.Aquí está un ejemplo:

select * 
from (
      SELECT row_number() over(partition by link order by day, month) row_id 
      , * 

      FROM posted 
      WHERE ad='$key' 
     ) x 
where x.row_id = 1 

Lo que esto hace es la función row_number pone una secuencia numérica dividida por cada enlace distinto que da lugar a la consulta.

Tomando solo esos row_numbers que = 1, solo devuelve 1 fila para cada enlace.

La forma de cambiar el enlace que se marca como "1" es a través de la cláusula de orden por la función row_number.

Espero que esto ayude.

1

Lo que se quiere es la siguiente: un solo

SELECT DISTINCT * FROM posted WHERE ad='$key' GROUP BY link ORDER BY day, month 

si hay 4 filas por ejemplo, cuando Link es el mismo, que captará (I Asume la primera).

Cuestiones relacionadas