2012-01-11 1 views
1

Можно ли выбрать одну строку в MySQL, а затем пропустить 4 строки, а затем пропустить 3 строки, а затем пропустить 5 строк, а затем закодировать это до конца таблицы?Выбирайте несколько строк с разными интервалами

Я нашел несколько учебников LIMIT и OFFSET онлайн, они работают, но хороши только для одного из установленных. Мне нужно несколько.

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

Мой PHP код выглядит следующим образом

$int_count = 0; 
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'"); 
while ($row = mysql_fetch_array($result)) { 

    if ($int_count == 0)$n_1 = ($row["note"]); 
    if ($int_count == 4)$n_2 = ($row["note"]); 
    if ($int_count == 7)$n_3 = ($row["note"]); 
    if ($int_count == 12)$n_4 = ($row["note"]); 
    if ($int_count == 16)$n_5 = ($row["note"]); 
    if ($int_count == 19)$n_6 = ($row["note"]); 
    if ($int_count == 24)$n_7 = ($row["note"]); 
    if ($int_count == 28)$n_8 = ($row["note"]); 
    if ($int_count == 31)$n_9 = ($row["note"]); 
    if ($int_count == 36)$n_10 = ($row["note"]); 
    if ($int_count == 40)$n_11 = ($row["note"]); 
    if ($int_count == 43)$n_12 = ($row["note"]); 
    if ($int_count == 48)$n_13 = ($row["note"]); 
    if ($int_count == 52)$n_14 = ($row["note"]); 

    $int_count++; 

    } 

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

Мне нужно иметь возможность выбрать базовую ноту из таблицы, а затем выбрать с 3 различными интервалами для создания аккордов.


Update

  $result2 = mysql_query("SELECT * 
      FROM `guitar_tunings_links` 
      JOIN guitar_tunings_chords ON guitar_tunings_links.".$funtion_string." = guitar_tunings_chords.note 
      WHERE tuning = '".$chrd_tn."'") or die(mysql_error()); 

       while ($row = mysql_fetch_array($result2)) { 
        $bridge_note = ($row["note_id"]);   
       }/* 
       var_dump ($key_note); 
       var_dump ($bridge_note); 
       var_dump ($funtion_string); 
       var_dump ($chrd_tn);*/ 
        // SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= 28 LIMIT 0,8 
       $result4 = mysql_query("SELECT * FROM `guitar_tunings_chords` WHERE `note_id` >= ".$bridge_note." LIMIT ".$tuning_capo.",8") or die(mysql_error()); 
       while ($row = mysql_fetch_array($result4)) { 

        //Notes 
        $note = ($row["note"]); 

        // Replace # with z 
        $note = str_replace("#", "z", $note); 

        // Distinguish nut notes on or off 
        if (preg_match("/\b".$note."\b/i", $notes_array)) { 
         $n_nut_style = 'note_nut_on'; 
        } else { $n_nut_style = 'note_nut_off'; 
        } 

        // Distinguish fretboard notes on or off 
        if (preg_match("/\b".$note."\b/i", $notes_array)) { 
         $n_style = 'note_on'; 
        } else { $n_style = 'note_off'; 
        } 
+0

Я знаю PHP, но я понятия не имею о гитарных аккордах. Думаю, вам стоит подробнее остановиться на этой части. – Hubro

+0

Вы можете изменить смещение и отправить запрос еще раз –

+0

1. Вам, вероятно, следует предпочесть * массив * или какой-либо другой сложный тип данных, а не scads индексированных суффиксных переменных. Например, 'array_push ($ notes, $ row [" note "])'. 2. Вы должны ЗАКАЗАТЬ, что запрос явно, а не полагаться на двигатель, случайно выбирающий нужный вам заказ, даже если это происходит как «неявно детерминированная авария». – pilcrow

ответ

2

Вы должны применить это к вашим точным таблицам, но он должен работать очень хорошо.

select * 
    from (select @i := @i+1 as count, 
       gtc.* from guitar_tunings_chords gtc 
     where note_id >= 27) counts 
    join (select @i := -1 as counter) dummy 
where count % 12 = 0 
    or (count-4) % 12 = 0 
    or (count-7) % 12 = 0; 

% 12 дает один полный цикл скачет, то -4 и -7 (а -0) является внутренним смещение внутри каждого цикла.

+0

+1 для эмуляции ROW_NUMBER() и перехода к желаемым строкам, поскольку [@Wrikken также предложил] (http://stackoverflow.com/questions/8825605/select -multiple-rows-at-different-interval/8825828 # comment11017620_8825828) – pilcrow

+1

ROW_NUMBER действительно должен быть родной функцией в MySQL. –

+1

+1 к этому. Стоит отметить, что инициализацию '@ i' можно поместить в производную таблицу : '... JOIN (SELECT @i: = -1 AS" counter ") dummy ...'. Я подниму его, потому что следующий вопрос почти всегда: «Отлично, но как это сделать в одном запросе? ? ":) – pilcrow

0

Попробуйте это ... Я не пробовал сам, но в моей голове, он должен работать :)

$row_count = 0; 
$result = mysql_query("SELECT * FROM guitar_tunings_chords WHERE note_id >= '27'"); 
$notes = array(); // Notes array 
$pattern = array(4,3,5); // Pattern to skip notes 
$i = 0; // For pattern position 
$first = true; 
while ($row = mysql_fetch_array($result)) { 
    if($first) { // Add the first note 
     $notes[] = $row["note"]; 
     $first = false; 
    } else { 
     if($row_count == $pattern[$i]) { 
      // Add note 
      $notes[] = $row["note"]; 
      $i++; // Change pattern position 
      // Jump to start of pattern 
      if($i == 3) 
       $i = 0; 
      // Reset count 
      $row_count = -1; 
     } 
    } 
    $row_count++; 
} 
+0

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

+0

http://www.gtdb.org/tuning_links/chord_generator/chords.php – warmwhisky

+0

Спасибо за ответ! Это выглядит хорошо, хотя я могу сделать весь интервал, добавляющий из конвертации ячейки Excel с запятыми между ними. – warmwhisky

0

Я бы рассмотреть, возможно, с использованием chord_note с интервалами (0,4,7,12,16,19 и т. д.) и используя это как часть вашего SELECT, добавляя начальное значение note_id (27) + запись в таблице chord_note

SELECT * 
    FROM guitar_tunings_chords 
WHERE note_id IN (SELECT 27+chord_interval 
         FROM chord_note 
       ) 

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

+0

Он принимает значащие идентификаторы, но если они есть, он будет работать (I ' d вставить 'ORDER BY' хотя ..) – Wrikken

+1

Хотя, без подзапроса, это может быть:' WHERE id - 27> = 0 AND (((id - 27)% 12) = 4 OR ((id- 27)% 12) = 7 OR (id - 27)% 12 = 0) LIMIT 14' – Wrikken

+0

Спасибо за ваше время Mark. Это, безусловно, то, что я сейчас рассматриваю. Хотя я действительно не понимаю ваш SQL-запрос, я думаю, что новая таблица с интервалами внутри была бы отличным способом достижения этого. Мой код выше для одного аккорда. В настоящее время я работаю над этим файлом http://www.gtdb.org/tuning_links/chord_generator/chords.php – warmwhisky

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

  • Нет связанных вопросов^_^