Что лучший способ состоит в том, чтобы выбрать минимальное значение из нескольких столбцов?

Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_VARIABLE

Возможный сценарий

Я не могу найти, где мой код поступил не так. Вот моя полная ошибка:

Ошибка анализа: ошибка синтаксиса, неожиданный T_VARIABLE в строке x

Что я пытаюсь

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

Ответ

Ошибка анализа: проблема с синтаксисом вашей программы, например, оставляя точку с запятой от конца инструкции или, как и в случае выше, пропускает оператор ..

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

Что вам нужно сделать, так это внимательно проверить строки, где ошибка для любых простых ошибок.

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

Хорошо читается: Список токенов парсера

So убедитесь, что вы включили хотя бы E_PARSE в своем php.ini. Ошибки анализа не должны существовать в производственных сценариях.

Я всегда рекомендовал добавить следующий оператор при кодировании:

error_reporting(E_ALL);

Отчет об ошибках PHP

Также неплохо использовать среду IDE, которая позволит вам знать ошибки разбора при наборе текста. Вы можете использовать:

  1. NetBeans (прекрасный мир красоты, бесплатное программное обеспечение) (лучший, на мой взгляд)
  2. PhpStorm (дядя Гордон любит это: P, платный план, содержит проприетарное и бесплатное программное обеспечение)
  3. Eclipse (красота и зверь, бесплатное программное обеспечение)

Вопросы, относящиеся:

66
задан Salman A 25 November 2016 в 10:09
поделиться

8 ответов

Вероятно, будет много способов выполнить это. Мое предложение к варианту использования/, Когда сделать это. С 3 столбцами это не слишком плохо.

Select Id,
       Case When Col1 < Col2 And Col1 < Col3 Then Col1
            When Col2 < Col1 And Col2 < Col3 Then Col2 
            Else Col3
            End As TheMin
From   YourTableNameHere
48
ответ дан G Mastros 24 November 2019 в 14:55
поделиться

При использовании SQL 2005, можно сделать что-то аккуратное как это:

;WITH    res
          AS ( SELECT   t.YourID ,
                        CAST(( SELECT   Col1 AS c01 ,
                                        Col2 AS c02 ,
                                        Col3 AS c03 ,
                                        Col4 AS c04 ,
                                        Col5 AS c05
                               FROM     YourTable AS cols
                               WHERE    YourID = t.YourID
                             FOR
                               XML AUTO ,
                                   ELEMENTS
                             ) AS XML) AS colslist
               FROM     YourTable AS t
             )
    SELECT  YourID ,
            colslist.query('for $c in //cols return min(data($c/*))').value('.',
                                            'real') AS YourMin ,
            colslist.query('for $c in //cols return avg(data($c/*))').value('.',
                                            'real') AS YourAvg ,
            colslist.query('for $c in //cols return max(data($c/*))').value('.',
                                            'real') AS YourMax
    FROM    res

Этот путь Вы не заблудились в таком количестве операторов:)

Однако это могло быть медленнее, чем другой выбор.

Это - Ваш выбор...

1
ответ дан SteveC 24 November 2019 в 14:55
поделиться

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

1
ответ дан Kev 24 November 2019 в 14:55
поделиться
select *,
case when column1 < columnl2 And column1 < column3 then column1
when columnl2 < column1 And columnl2 < column3 then columnl2
else column3
end As minValue
from   tbl_example
1
ответ дан Phil Corcoran 24 November 2019 в 14:55
поделиться

Это - грубая сила, но работы

 select case when col1 <= col2 and col1 <= col3 then col1
           case when col2 <= col1 and col2 <= col3 then col2
           case when col3 <= col1 and col3 <= col2 then col3
    as 'TheMin'
           end

from Table T

..., потому что минута () работает только над одним столбцом а не через столбцы.

3
ответ дан Learning 24 November 2019 в 14:55
поделиться

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

Select T.Id, T.Col1, T.Col2, T.Col3, A.TheMin
From   YourTable T
       Inner Join (
         Select A.Id, Min(A.Col1) As TheMin
         From   (
                Select Id, Col1
                From   YourTable

                Union All

                Select Id, Col2
                From   YourTable

                Union All

                Select Id, Col3
                From   YourTable
                ) As A
         Group By A.Id
       ) As A
       On T.Id = A.Id
5
ответ дан G Mastros 24 November 2019 в 14:55
поделиться

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

право способ сделать, это, по-моему, должно иметь следующую таблицу:

ID    Col    Val
--    ---    ---
 1      1      3
 1      2     34
 1      3     76

 2      1     32
 2      2    976
 2      3     24

 3      1      7
 3      2    235
 3      3      3

 4      1    245
 4      2      1
 4      3    792

с ID/Col как первичный ключ (и возможно Col как дополнительный ключ, в зависимости от Ваших потребностей). Тогда Ваш запрос становится простым select min(val) from tbl, и можно все еще рассматривать отдельные 'старые столбцы' отдельно при помощи where col = 2 в других запросах. Это также допускает легкое расширение, должен число 'старых столбцов' расти.

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

<час>

Однако, если бы по некоторым причинам Вы не можете изменение те столбцы, я предложил бы использовать, вставляют и обновляют триггеры и добавляют другой столбец, который эти триггеры установили на минимум на Col1/2/3. Это переместит 'стоимость' операции далеко от выбора до обновления/вставления, где это принадлежит - большинство таблиц базы данных, по моему опыту, читается намного чаще, чем записанный настолько подвергающийся стоимости на записи, имеет тенденцию быть более эффективным со временем.

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

ID   Col1   Col2   Col3   MinVal
--   ----   ----   ----   ------
 1      3     34     76        3
 2     32    976     24       24
 3      7    235      3        3
 4    245      1    792        1

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

7
ответ дан paxdiablo 24 November 2019 в 14:55
поделиться

И этот вопрос И этот вопрос попытка ответить на это.

резюме - то, что Oracle имеет созданный в функции для этого с SQL-сервером, Вы застреваете или определение пользовательской функции или использование операторов выбора.

2
ответ дан Community 24 November 2019 в 14:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: