MySQL: obtener datos de otra tabla sin duplicados -- mysql campo con sql camp Relacionados El problema

MySQL: Get data from another table without duplicates


1
vote

problema

Español

Soy un principiante en MySQL y estoy teniendo un poco de problema. Tengo dos mesas. Uno de ellos se llama core y tiene 200.000 entradas y contiene la columna messageid . Otra tabla se llama recipients , tiene 1.200.000 entradas y tiene las columnas 9988777665 , messageid y personid .

Estoy creando una nueva columna personid en la tabla core EN PEDIDO Importar el <div> <div class="comp-navbar" ng-class="type"> <ul> <li ng-repeat="link in links" ui-sref-active="selected"> <a ui-sref="{{ link.state }}">{{ link.name }}</a> </li> </ul> </div> </div> 0 ENTRADAS DONDE EL <div> <div class="comp-navbar" ng-class="type"> <ul> <li ng-repeat="link in links" ui-sref-active="selected"> <a ui-sref="{{ link.state }}">{{ link.name }}</a> </li> </ul> </div> </div> 1111 En ambas columnas son las mismas. Sé que en la tabla <div> <div class="comp-navbar" ng-class="type"> <ul> <li ng-repeat="link in links" ui-sref-active="selected"> <a ui-sref="{{ link.state }}">{{ link.name }}</a> </li> </ul> </div> </div> 2 , hay varias entradas para varios <div> <div class="comp-navbar" ng-class="type"> <ul> <li ng-repeat="link in links" ui-sref-active="selected"> <a ui-sref="{{ link.state }}">{{ link.name }}</a> </li> </ul> </div> </div> 313 's, así que solo quiero devolver el primero. Estoy usando la siguiente consulta SQL:

  <div>     <div class="comp-navbar" ng-class="type">         <ul>             <li ng-repeat="link in links" ui-sref-active="selected">                 <a ui-sref="{{ link.state }}">{{ link.name }}</a>             </li>         </ul>     </div> </div> 4  

No entiendo por qué, pero no funciona. Funciono cuando quiero importar datos de otras tablas, pero no esta. En última instancia, simplemente bloquea mi servidor PHP / MySQL local.

¿Tendrías alguna idea de cómo hacer eso?

Actualización:

Aquí está el resultado del índice de espectáculos de los destinatarios. El nombre de la columna "destinatario" tiene una cardinalidad de 1356207 y el índice es BTREE. El nombre de la columna "MessageID" tiene una cardinalidad de "NULL" y el índice es BTREE.

Cuando ejecuto Mostrar índice de Core, la consulta se ejecuta con éxito, pero no se muestra nada. ¿Significa que hay un problema?

Original en ingles

I am a beginner in MySQL and I am having a bit of a problem. I have two tables. One of them is called core and has 200.000 entries and contains the column messageid. Another table is called recipients, has 1.200.000 entries and has the columns recipientid, messageid and personid.

I am creating a new column personid in the table core in order import the personid entries where the messageid in both columns are the same. I know that in the table recipients, there are multiple entries for several messageid's, so I just want to return the first one. I am using the following sql query:

UPDATE core A SET personid = (SELECT personid FROM recipients B WHERE B.messageid = A.messageid) 

I do not understand why, but it does not work. I works when I want to import data from other tables, but not this one. Ultimately, it just crashes my local php/mysql server.

Would you have any idea on how to do that?

Update:

Here is the result of SHOW INDEX FROM recipients. The column name "recipientid" has a cardinality of 1356207 and the indextype is BTREE. The column name "messageid" has a cardinality of "NULL" and the indextype is BTREE.

When I run SHOW INDEX FROM core, the query runs successfully, but nothing is displayed. Does it mean there is a problem?

     
   
   

Lista de respuestas

0
 
vote

Parte 0 - Antes de hacer algo más ...

... Debe poder realizar consultas en core sin que se apaguen o bloquee el servidor. Sobre la base de su pregunta actualizada, es probable que tenga que crear algunos índices en core para ayudar a acelerar las consultas en él (de lo contrario, la base de datos tiene que escanear la tabla completa < / strong> para asegurarse de que esté haciendo lo correcto). Al mínimo, un índice en messageid debería ayudar:

  ALTER TABLE core ADD INDEX messageid_idx(messageid);   

Este índice en MessageId debería ayudar a acelerar cualquier consulta que opere sobre esa columna, como la consulta de actualización.

El resto de mi respuesta vendrá en dos partes. Primero, la respuesta a su pregunta, donde está seguro de que desea ignorar múltiples messageid5 's por messageid6 en recipients .

La segunda parte de mi respuesta contiene consultas adicionales que realizaría por adelantado para analizar el múltiplo personid para determinar si realmente importan o no. Tal vez esté realmente seguro de que el múltiple personid 's por core0 no es un gran problema, pero luego, entonces, esto beneficiará a otros que buscan respuestas a las preguntas similares a las suyas.

Parte 1: Solo cualquier persona hará, gracias

Para los destinatarios con más de uno core1111/14/14/12 POR core2 , simplemente dejaremos que el motor de la base de datos decida qué 99887776613 se usa para actualizar:

  core4  

lo suficientemente simple, ¿verdad? OK, sigamos adelante.

Parte 2: En realidad, estoy interesado en esos mensajes con varias personas. ¿Cuáles son?

Si solo desea saber qué core5 tiene múltiples messageid16 está asociado con ellos, puede consultarlos con esto:

  core7  

Si también desea ver el messageid18 asociado con ellos, puede usar la siguiente consulta. Nota, habrá DUPLICADO core9 's, uno para cada industre core0 :

  core1  

¿Entendí su pregunta correctamente y proporcioné la respuesta que necesita? Eso espero. Muchas gracias a sqlfiddle por ayudarme a asegurarme de que esas consultas realmente funcionaran para usted.

 

Part 0 - Before you do anything else...

... you need to be able to perform queries on core without them either timing out or crashing the server. Based on your updated question, you're probably going to have to create some indexes on core to help speed up queries on it (otherwise the database has to scan the entire table to make sure it's doing the right thing). At the very minimum, an index on messageid should help:

ALTER TABLE core ADD INDEX messageid_idx(messageid); 

This index on messageid should help speed up any queries that operate upon that column, like the update query.

The rest of my answer will come in two parts. First, the answer to your question, where you are sure you want to ignore multiple personid's per messageid in recipients.

The second part of my answer contains additional queries that I would perform upfront to analyze the multiple personid's to ascertain whether or not they really matter. Perhaps you're really sure that the multiple personid's per messageid is no big deal, but then hopefully this will benefit others seeking answers to questions similar to yours.

Part 1: Just any personid will do, thanks

For recipients with more than one personid per messageid, we'll just let the database engine decide which personid to use for update:

-- Update core personid with recipients personid where messageid matches UPDATE     core     INNER JOIN (         SELECT             messageid,             personid         FROM             recipients         GROUP BY             messageid     ) AS one_message_per_person USING (messageid) SET     core.personid = one_message_per_person.personid 

Simple enough, right? Ok, let's move on.

Part 2: Actually, I'm interested in those messages with multiple people. Which ones are they?

If you just want to know which messageid's have multiple personid's associated with them, you can query them with this:

-- Find messageids with more than one personid SELECT     messageid,     personid,     COUNT(DISTINCT personid) AS num_people_in_message FROM     recipients GROUP BY     messageid HAVING     num_people_in_message > 1 

If you also want to see the individual personid's associated with them, you can use the following query. Note, there will be duplicate messageid's, one for each indvidual personid:

-- Show the messageid and personid of the messages with multiple people     SELECT     messageid,     personid FROM     recipients WHERE     messageid IN (         SELECT             messageid         FROM             (                 SELECT                     messageid,                     personid,                     COUNT(DISTINCT personid) AS num_people_in_message                 FROM                     recipients                 GROUP BY                     messageid                 HAVING                     num_people_in_message > 1             ) AS messages_with_multiple_people     ) GROUP BY     messageid, personid 

Did I understand your question correctly and provide the answer you needed? I hope so. Many thanks to sqlfiddle for helping me make sure those queries would actually work for you.

 
 
   
   
-1
 
vote

No creo que pueda usar Seleccionar y actualizar en una consulta para MySQL Mi consejo sería usar procedimientos para lograr el mismo

 

I don't think you can use select and update in one query for MySQL my advice would be to use procedures to achieve the same

 
 

Relacionados problema

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

125  ¿Hay un sistema de control de versiones para los cambios de la estructura de la base de datos?  ( Is there a version control system for database structure changes ) 
A menudo me encuentro con el siguiente problema. Trabajo en algunos cambios en un proyecto que requiere nuevas tablas o columnas en la base de datos. Hago l...

62  Cambie los valores de columna indexados únicos en la base de datos  ( Swap unique indexed column values in database ) 
Tengo una tabla de base de datos y uno de los campos (no la clave principal) está teniendo un índice único en él. Ahora quiero intercambiar valores debajo de ...

65  Decodificación T-SQL FUNCIONES EN C # / VB.NET  ( Decoding t sql cast in c vb net ) 
Recientemente, nuestro sitio ha sido desalentado con el resurgimiento de la asprox botnet inyección de SQL Ataque. Sin entrar en detalles, el ataque inten...

126  Bases de datos de archivos planos [cerrados]  ( Flat file databases ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

26  ¿Por qué la indexación de texto completo de SQL no tiene resultados de devolución de texto para las palabras que contienen #?  ( Why doesnt sql full text indexing return results for words containing ) 
Por ejemplo, mi consulta es como la siguiente utilizando SQL Server 2005: SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') Tengo un índice de tex...

2520  ¿Cómo funciona la indexación de la base de datos? [cerrado]  ( How does database indexing work ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

43  Mapas de sitio ASP.NET  ( Asp net site maps ) 
¿Alguien tiene experiencia en la creación de proveedores de mapas de sitio ASP.NET basados ​​en SQL? Tengo el archivo XML predeterminado web.sitemap Traba...

146  ¿Marque los cambios en una tabla de SQL Server?  ( Check for changes to an sql server table ) 
¿Cómo puedo monitorear una base de datos de SQL Server para cambios en una tabla sin usar desencadenantes o modificando la estructura de la base de datos de n...

66  ¿Cómo indexo una columna de base de datos?  ( How do i index a database column ) 
Ojalá, puedo obtener respuestas para cada servidor de base de datos. Para un resumen de cómo se retira las obras de indexación: ¿Cómo funciona la indexació...




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