2016-03-12 6 views
0

я занимаюсь разработкой небольшое приложение, которое заболевание после того, как спрашивать о симптомах ,, PHP + MySQLмассив в котором положение в MySQL

мой стол enter image description here

У меня есть массив симптомов, я хочу, чтобы получить болезни, которые соответствуют симптомам массива

$a= array('fever','pain'); 
$sql=mysql_query("select * from disease where `d_symptoms` like '$a'"); 

уже судимым с использованием соединения и в

echo $v=join(',',$a); 
$sql=mysql_query("select * from disease where `d_id` in ($v)"); 

, пожалуйста, помогите мне

+4

Вот почему CSV не является прекрасной идеей. Вы должны хранить эти 'd_symptoms' в отдельной таблице с отношением один к многим с' d_name'. – Sean

+1

Вы проверили последнюю запятую (,)? Вы должны использовать $ v = substr ($ v, 0, -1); –

+0

Вместо соединения fuction Попробуйте выполнить команду implode() –

ответ

-2

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

Но, может быть что-то, как это будет работать, если вы хотите, чтобы продолжить путь у вас есть:

$query = "select * from disease where d_symptoms like " . $a[0]; 
for($i = 1; $i < count($a); i++){ 
    $query = $query + " AND d_symptoms like " $a[$i]; 
} 

$sql=mysql_query($query); 
+1

Это займет ненужное время. И LIKE не является хорошим вариантом в этом случае –

+0

Первая строка хорошая. Я бы поддержал это. – Strawberry

1

вам нужно иметь новую таблицу под названием симптомы, которая включает в себя внешний ключ от ид болезни (d_id) в вашей текущей таблице и имени симптома (d_symptom). Тогда каждая строка будет иметь имя симптома и идентификатор заболевания, с которым он связан. Таким образом, вы не будете иметь несколько значений в поле симптомов. Затем вы называете это выбором всех симптомов, где id = 'd_id', чтобы получить список симптомов, связанных с этим заболеванием.

запрос может быть

$a= array('fever','pain'); 
$sql=mysql_query("SELECT d_name FROM disease, symptoms WHERE disease.d_id = symptoms.d_id AND d_symptom IN ($a)";); 

или что-то ..

+0

Не используйте соединения с запятой. Они вышли с динозаврами – Strawberry

-1

Вы можете использовать один FIND_IN_SET для каждых Симптомов вы ищете:

$query = "SELECT * FROM disease WHERE 1=1 "; 
    foreach($a as $row) 
     $query += "AND FIND_IN_SET($row, d_symptoms)"; 
    $sql=mysql_query($query); 
1

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

Болезнь Таблица

id  | d_name 
--------------------- 
1  | Dengu 
2  | Typhoid 
3  | Cervical 

Симптомы стол

id  | s_name 
--------------------- 
1  | Fever 
2  | Pain 
3  | Vomit 
4  | Abc 
5  | Xyz 

Болезнь Симптом таблица (это пересечение)

id  | d_id | s_id 
--------------------------- 
1  | 1  | 1 
2  | 1  | 2 
3  | 1  | 3 
2  | 2  | 3 
3  | 2  | 2 
1  | 2  | 4 
2  | 3  | 2 
3  | 1  | 5 

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

SELECT id, s_name FROM symptoms 

даст вам список всех доступных признаков.

SELECT diseases.id, diseases.d_name, symptoms.s_name 
FROM diseases 
JOIN diseases_symptoms ON d_id = diseases.id 
JOIN symptoms ON symptoms.id = diseases_symptoms.s_id 
WHERE diseases.id = 1; 

даст вам результат, аналогичный:

id  | d_name | s_name 
--------------------------- 
1  | Dengu  | Fever 
2  | Dengu  | Pain 
3  | Dengu  | Vomit 
Смежные вопросы