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 ║
╚══════════╩════════════════════════════╝