vez una tiempo tablas tabla relacionadas mismo llave insertar importar guardar foranea desde datos con como php mysql left-join group-concat find-in-set

una - insertar datos en tablas relacionadas mysql desde php



MySQL une dos tablas con valores separados por comas (2)

Tengo 2 mesas como abajo

Tabla de notas

╔══════════╦═════════════════╗ ║ nid ║ forDepts ║ ╠══════════╬═════════════════╣ ║ 1 ║ 1,2,4 ║ ║ 2 ║ 4,5 ║ ╚══════════╩═════════════════╝

Tabla de posiciones

╔══════════╦═════════════════╗ ║ id ║ name ║ ╠══════════╬═════════════════╣ ║ 1 ║ Executive ║ ║ 2 ║ Corp Admin ║ ║ 3 ║ Sales ║ ║ 4 ║ Art ║ ║ 5 ║ Marketing ║ ╚══════════╩═════════════════╝

Estoy buscando consultar mi tabla de notas y asociar la columna ''forDepts'' con los valores de la tabla de posiciones.

La salida debe ser:

╠══════════╬════════════════════════════╣ ║ 1 ║ Executive, Corp Admin, Art ║ ║ 2 ║ Art, Marketing ║ ╚══════════╩════════════════════════════╝

Sé que la base de datos debería normalizarse, pero no puedo cambiar la estructura de la base de datos para este proyecto.

Esto se utilizará para exportar un archivo de Excel con el siguiente código.

<?PHP $dbh1 = mysql_connect($hostname, $username, $password); mysql_select_db(''exAdmin'', $dbh1); function cleanData(&$str) { $str = preg_replace("//t/", "//t", $str); $str = preg_replace("//r?/n/", "//n", $str); if(strstr($str, ''"'')) $str = ''"'' . str_replace(''"'', ''""'', $str) . ''"''; } $filename = "eXteres_summary_" . date(''m/d/y'') . ".xls"; header("Content-Disposition: attachment; filename=/"$filename/""); header("Content-Type: application/vnd.ms-excel"); //header("Content-Type: text/plain"); $flag = false; $result = mysql_query( "SELECT p.name, c.company, n.nid, n.createdOn, CONCAT_WS('' '',c2.fname,c2.lname), n.description FROM notes n LEFT JOIN Positions p ON p.id = n.forDepts LEFT JOIN companies c ON c.userid = n.clientId LEFT JOIN companies c2 ON c2.userid = n.createdBy" , $dbh1); while(false !== ($row = mysql_fetch_assoc($result))) { if(!$flag) { $colnames = array( ''Created For'' => "Created For", ''Company'' => "Company", ''Case ID'' => "Case ID", ''Created On'' => "Created On", ''Created By'' => "Created By", ''Description'' => "Description" ); // display field/column names as first row echo implode("/t", array_keys($colnames)) . "/r/n"; $flag = true; } $row[''createdOn''] = date(''m-d-Y | g:i a'', strtotime($row[''createdOn''])); array_walk($row, ''cleanData''); echo implode("/t", array_values($row)) . "/r/n"; } exit; ?>

Este código genera solo el primer valor de ''forDepts''

Exa: Ejecutivo (en lugar de Ejecutivo, Administración de Corp, Arte)

¿Se puede lograr esto mediante CONCAT o FIND_IN_SET?

¡Por favor ayuda! ¡Gracias por adelantado!


SELECT a.nid, GROUP_CONCAT(b.name ORDER BY b.id) DepartmentName FROM Notes a INNER JOIN Positions b ON FIND_IN_SET(b.id, a.forDepts) > 0 GROUP BY a.nid


Table 1 ╔══════════╦═════════════════╗ ║ nid ║ forDepts ║ ╠══════════╬═════════════════╣ ║ 1 ║ 1,2,4 ║ ║ 2 ║ 4,5 ║ ╚══════════╩═════════════════╝ Table 2 ╔══════════╦═════════════════╗ ║ id ║ name ║ ╠══════════╬═════════════════╣ ║ 1 ║ Executive ║ ║ 2 ║ Corp Admin ║ ║ 3 ║ Sales ║ ║ 4 ║ Art ║ ║ 5 ║ Marketing ║ ╚══════════╩═════════════════╝ SELECT * FROM table1 as t1 LEFT JOIN table2 as t2 ON find_in_set(t2.id, t1.forDepts) Output ╠══════════╬════════════════════════════╣ ║ 1 ║ Executive, Corp Admin, Art ║ ║ 2 ║ Art, Marketing ║ ╚══════════╩════════════════════════════╝