2011-02-04 5 views
0

У меня есть таблица с 15 колонками. То, что я хотел бы сделать, - это выбрать диапазон идентификаторов и предоставить все данные столбцов одинаково, представленные мне.SQL найти те же данные столбца

В минуту, он у меня структурирована следующим образом:

SELECT id, col_a, col_b ... count(id) 
FROM table 
GROUP BY col_a, col_b ... 

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

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

Спасибо,

Dan

UPDATE:

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

E.G. В MainTable ColA теперь ссылается на таблицу ColA

Я до сих пор все еще решаю проблему с PHP, главным образом, поскольку я думаю, что она все еще оставляет проблему, упомянутую выше, но по крайней мере сейчас Im не сохраняет дублируемую информацию ,

+0

Интересно, если вы не должны реорганизовать архитектуру базы данных? Идея создания реляционной базы данных состоит в том, чтобы предотвратить хранение одних и тех же данных в разных местах. Однако может быть вполне обоснованная причина для подобных действий. Вход пользователя приходит на ум ... но я бы проверял данные перед хранением в db. – Peter

+0

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

+0

Признателен пример фактической структуры таблицы, а также фактических данных. На данный момент ваш стол выглядит так, будто он страдает от больших структурных изъянов и неправильных представлений. –

ответ

0

Свы волосатая вещь, чтобы сделать, но вы могли бы сделать это так же, как как Дэвид Мортенссон предложил, я бы написать это, однако:

Select a.id, a.col1, a.col2, a.col3 
FROM myTable a, myTable b 
WHERE a.id != b.id 
and a.col1 = b.col1 
and a.col2 = b.col2 
and a.col3 = b.col3 

это даст вам идентификаторы, которые являются уникальными, но каждый результат будет иметь то же значение столбцы 1, 2 и 3. Однако я согласен с некоторыми из комментаторов на ваш вопрос, что вы должны рассмотреть альтернативную структуру данных, поскольку это может лучше использовать модель RDBMS. В этом случае, вы хотели бы иметь 2 таблицы: Имя

Таблица: MyTableIds Поля: И.Д., attrId

Название таблицы: MyTableAttrs Поля: attrId, attr1, attr2, attr3, ЭСТ

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

0

Сделать присоединиться к подзапросу с группой по:

SELECT a.id, b.col_a, b.col_b ... b.count) 
FROM table a 
LEFT JOIN (
    SELECT id, col_a, col_b ... count(id) "count" 
    FROM table GROUP BY col_a, col_b ... 
)b on a.id = b.id 

Таким образом, внешние будет выбрать все строки.

Если вы все еще хотите, чтобы сгруппировать ответы, которые вы могли бы использовать UNION вместо

SELECT id, col_a ... 
WHERE id NOT IN ("SUBQUERY WITH GROUP BY") 
UNION 
"SUBQUERY WITH GROUP BY" 

Не приятное решение, но оно должно работать

0

Кажется, это возможно, потому что я понял ваш вопрос.

А вот возможный образец:

SELECT 
    /* GROUP BY columns */ 
    col_A, 
    col_B, 
    ... 

    /* aggregated columns */ 
    CASE MIN(col_M) WHEN MAX(col_M) THEN MIN(col_M) ELSE NULL END, 
    CASE MIN(col_N) WHEN MAX(col_N) THEN MIN(col_N) ELSE NULL END, 
    ... 
    COUNT(...), 
    SUM(...), 
    WHATEVER(...), 
    ... 
FROM ... 
GROUP BY col_A, col_B, ... 
+1

WHATEVER() выполняется тихо. Это функция, которая выполняется, когда у вас есть столбцы в предложении SELECT, которые не входят в предложение GROUP BY. (кашель) –

+0

@Catcall: На самом деле да, вы правы, спасибо! Почему-то это не перешло мне в голову, когда я сочинял это шутливое имя для произвольной совокупности. В следующий раз мне нужно быть более осторожным. –

Смежные вопросы