MySQL, объедините два подмножества одной таблицы - PullRequest
0 голосов
/ 13 февраля 2012

У меня проблема с построением запроса ...

У меня есть одна таблица, которая содержит строки: имя, начало, конец, ссылка, alt, PatientNo. Пример данных выглядит так:

chr1, 10, 10, A, B, 9999;
chr1, 12, 12, B, A, 9999;
chr1, 18, 18, A, B, 9999;
chr1, 29, 29, C, B, 9999;
chr1, 10, 10, A, A, 8888;
chr1, 12, 12, A, B, 8888;
chr2, 18, 18, D, C, 8888;
chr2, 29, 29, A, B, 8888;

конец так далее ...

Мне нужно создать запрос, который сравнивает пациентов друг с другом. т.е .: if (chr1, начало, конец, альтернатива пациента 9999) = (chr1, начало, конец, альтернатива пациента 8888) вернуть строку ...

есть идеи как сделать такой запрос? спасибо

Edit:

ОК, у меня все еще есть проблема. У меня есть десять CSV-файлов с геномными данными пациентов. Каждый файл содержит около 70000 строк. Я помещаю данные из файлов CSV в базу данных MySQL (поэтому моя база данных содержит одну таблицу с 700000 строками).

Теперь мне нужно отфильтровать эти данные. Есть много столбцов, например: имя (varchar), начало (int), end (int), ref (varchar), alt (varchar), пациент № 1027 * (varchar). Пример заявления: SELECT name, start, end, ref, alt, patientNo FROM mytable; возвращает следующие данные:

chr1, 10, 10, A, C, 9999;
chr1, 12, 12, T, T, 9999;
chr2, 18, 18, A, T, 9999;
chr2, 29, 29, C, C, 9999;
chr3, 10, 10, A, G, 9999;
chr3, 12, 12, A, C, 9999;
chr1, 18, 18, G, C, 8888;
chr2, 29, 29, A, G, 8888;
chr2, 10, 10, A, G, 8888;
chr3, 12, 12, G, A, 8888;
chr1, 18, 18, A, G, 666z;
chr2, 29, 29, C, G, 666z;
chr3, 10, 10, A, A, 666z;
chr4, 12, 12, A, G, 666z;
chr5, 18, 18, T, C, 666z;
chr1, 29, 29, A, G, 44a4;
chr1, 10, 10, A, G, 44a4;
chr2, 12, 12, G, A, 44a4;
chr2, 18, 18, A, G, 44a4;
chr1, 29, 29, C, G, 3333;
chr1, 10, 10, A, A, 3333;
chr1, 12, 12, A, G, 3333;
chr1, 18, 18, T, C, 3333;
chr2, 29, 29, A, G, 3333;

Мне нужно извлечь строки, которые имеют уникальную букву в столбце alt , с указанием name и start position, alt письмо, которое является уникальным для пациента. Если я присоединюсь к столбцам

SELECT p1.name, p1.start, p1.alt, p2.alt, p3.alt, p4.alt, p5.alt 
FROM mytable p1, mytable p2, mytable p3, mytable p4, mytable p5 
WHERE ( p1.patientNo = "9999" and p2.patientNo = "8888" and 
        p3.patientNo = "666z" and p4.patientNo = "44a4" and
        p5.patientNo = "3333") ;

Я получаю результаты, например ::1010 *

chr1 10 A A A A A
chr1 13 G G G G G
chr2 17 A A G A A
chr2 19 A A G G A
chr3 38 A C A T T 

так что значит:

  • В начале позиции = 10 каждый пациент p1, p2, p3, p4, p5 получил букву A. Это хорошо, что мы пропустили этот ряд
  • То же самое с начальным положением 13.
  • В позиции start = 17 пациент p3 получил уникальную букву G, поэтому мы поместите эту строку в таблицу результатов
  • В следующем ряду (19) нет уникальной буквы, мы ее пропускаем.
  • В строке (38) буква «С» является уникальной буквой, поэтому мы помещаем пациента p2 в таблица результатов.

Итак, результат приведенного выше примера должен выглядеть следующим образом:

chr2, 17, G, 666z
chr3, 19, C, 8888 

Можно ли построить запрос, который будет возвращать такой результат из исходной таблицы?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Не пробовал, но вижу:

SELECT p1.*, p2.* FROM tablePatients p1, tablePatients p2 WHERE p1.chr1 = p2.chr1  AND p1.start = p1.start AND p1.end = p2.end AND p1.ref = p2.ref AND p1.alt = p2.alt
0 голосов
/ 13 февраля 2012
SELECT a.name, a.start, a.end, a.alt, a.patientNo,
    b.name, b.start, b.end, b.alt, b.patientNo
FROM patient AS a, patient AS b
WHERE a.name = b.name
AND a.start = b.start
AND a.end = b.end
AND a.alt = b.alt
AND a.patientNo < b.patientNo
ORDER by a.name

со следующей формой:

SELECT <Columns> FROM <Table(s)> WHERE <Condition> ORDER BY <Columns>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...