При выборе всего из MySQL я могу переименовать определенные поля и по-прежнему выбирать все остальное, как с *

Привет, ребята. Итак, я пытаюсь выяснить, как выбрать каждое поле через несколько таблиц в базе данных mysql и вывести результирующую таблицу в a .csv-файл для Excel. Я нашел печально известный вопрос о stackoverflow .csv ouput и есть весь код там. Итак, я думаю, что я спрашиваю:

есть ли способ сделать запрос mysql, который выглядит примерно так?

SELECT * prof.id AS youth_id FROM time time, profiles prof, WHERE foo='bar'

и выберите все из обеих (или как 4) таблиц, но выберите id как youth_id, или мне нужно указать каждое значение, которое я хочу, если мне нужно выбрать определенные значения в качестве другого имени?

Я хотел бы не указывать каждое поле, так как у меня есть 50+ для вывода.

Я пытался искать, но не могу найти то, что мне нужно. Я думаю, если бы вы могли указать мне в правильном направлении, это было бы здорово.

4 ответов


вам не нужно указывать каждое поле. Вместо этого вы можете сделать следующее:

SELECT *, prof.id AS youth_id FROM time time, profiles prof

однако вышеизложенное вернет все столбцы из двух таблиц плюс столбец, который вы переименовали. Поэтому, если исходные две таблицы имеют всего 4 столбца, и вы переименуете один, вы получите 5 столбцов в результирующем наборе.


Райан, ты можешь делать, что хочешь. Единственный улов-результаты будут включать как youth_id, так и id с одинаковыми значениями для каждого. Если вы хотите только youth_id & not id, вам придется перечислить все столбцы, которые вы хотите, вместо использования'*'. Кстати, если у вас есть phpmyadmin под рукой, вы можете просто ввести sql и сразу увидеть результат.


Ну, поскольку никакое другое решение не кажется идеальным, я собираюсь подумать вне коробки на секунду. Если вы не против сделать два звонка. Одним из них может быть схема таблицы (где хранятся имена столбцов), а затем вы можете программно изменять имена столько, сколько необходимо (без ввода их всех). После этого сделать второй звонок с схлопнулся массива как его выбрать часть.

пример:

<?php
$tables = array ('table1','table2','table3');
$NameAliases = array('table1.id'=>'profid');

foreach ($tables as $table)
{
    $sql = "SHOW COLUMNS FROM $table;";
    $result = mysql_query($sql);

    $columns = array();

    while ($row = mysql_fetch_array($result))
    {
        $search = array_search($table.'.'.$row["Field"],$NameAliases);
        if ($search === true)
        {
            $parts = explode('.',$NameAliases[$search]);
            $columns[] = "$table.{$row["Field"]} AS {$parts[1]}"; //get the side of the dot
        }
        else
        {
            $columns[] = "$table.{$row["Field"]}";
        }
    }
}
$columnstring = implode(', ',$columns);
$sql = "SELECT $columnstring FROM ".implode(', ',$tables)." WHERE 1=1";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result))
{

}
?>

(Не знаю, работает ли это вообще)


Если вы действительно не хотите, чтобы дублирование столбца (т. е. получение id и youth_id) из

SELECT *, prof.id AS youth_id 
FROM time 
INNER JOIN profiles prof 
   ON time.profile_id = prof.id 
WHERE foo = 'bar'

вы можете SELECT * из всех таблиц, кроме таблицы со столбцом, который вы хотите псевдоним:

SELECT time.*, prof.id AS youth_id, prof.forename, prof.surname 
FROM time 
INNER JOIN profiles prof 
   ON time.profile_id = prof.id 
WHERE foo = 'bar'

Это позволит вам получить все столбцы от времени, а также перечисленные из профилей. Вам все равно нужно перечислить все столбцы в таблице, в которой вы ищете псевдоним столбца, но, по крайней мере, вам не нужно перечислять все.

конечно, существует также аргумент, что вы должны перечислить все столбцы в любом случае, если ваша схема изменится в какой-то момент, но это другая история.